private void doSomething(Map<String, String> someArguments) throws CustomException {
MyEnum runType = getRunType(someArguments);
switch (runType) {
case FRUIT:
new FruitClass().workNow();
break;
case VEGETABLE:
new VegetableClass().workNow();
break;
default:
// log that the type is not known
}
}
workNow
就像:
workNow() throws CustomException
立即工作
方法运行了几分钟并做了一些工作。我的问题是
立即工作
对于
FRUIT
VEGETABLE
)正在进行,另一个调用以相同的类型发生(
FruitClass
实例并开始执行其
平行地。
private void doSomething(Map<String, String> someArguments) {
MyEnum runType = getRunType(someArguments);
switch (runType) {
case FRUIT:
synchronized (FruitClass.class){
new FruitClass().workNow();
}
break;
case VEGETABLE:
synchronized (VegetableClass.class){
new VegetableClass().workNow();
}
break;
default:
// log that the type is not known
}
}
从答案到
this question
这个很好用。但是它在同步类上构建了一个等待线程队列,一旦前一个线程释放锁,它就会获得锁。
为了增强我的知识,有没有一种方法可以确定当线程进入并看到类上的锁时,它不是等待,而是终止。
. 让我把门锁上
水果类
. 哦!另一个线程已经有了锁并且正在执行
立即工作
. 我什么都不用做。“终止。”
编辑1:
从下面的答案来看:
final Lock reentrantLock = new ReentrantLock();
private void doSomething(Map<String, String> someArguments) {
MyEnum runType = getRunType(someArguments);
switch (runType) {
case FRUIT:
if(reentrantLock.tryLock()) {
try {
new FruitClass().workNow();
} finally {
reentrantLock.unlock();
}
} else {
// do nothing and terminate
}
break;
case VEGETABLE:
synchronized (VegetableClass.class){
new VegetableClass().workNow();
}
break;
default:
// log that the type is not known
}
}
然而,这显然行不通。因为这只会实例化新的
水果类
正如我最初的问题所说,如果一个对象已经创建并且正在执行,我想锁定新对象本身的创建
立即工作
如何使用锁实现这一点?
我不知道这样的事情是否可能:
final Lock reentrantLock = new ReentrantLock(FruitClass.class);