我已经阅读了这个主题,以及这篇关于尝试使用资源锁的博客文章,因为这个问题突然出现在我的脑海中。但实际上,我更愿意尝试使用 lock,我的意思是没有锁实例化。它会让我们从冗长的
lock.lock();
try {
//Do some synchronized actions throwing Exception
} finally {
//unlock even if Exception is thrown
lock.unlock();
}
宁愿看起来像:
? implements Unlockable lock ;
...
try(lock) //implicitly calls lock.lock()
{
//Do some synchronized actions throwing Exception
} //implicitly calls finally{lock.unlock();}
所以它不会是 TWR,而只是一些样板清洁。
您是否有任何技术理由建议描述为什么这不是一个合理的想法?
编辑:为了澄清我的建议和一个简单的synchronized(lock){}
块之间的区别,请检查这个片段:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
public static void main(String[] args) {
ReentrantLock locker =new ReentrantLock();
Condition condition = locker.newCondition();
Thread t1 = new Thread("Thread1") {
@Override
public void run(){
synchronized(locker){
try {
condition.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Thread1 finished");
}
}
} ;
Thread t2 = new Thread("Thread2") {
@Override
public void run(){
synchronized(locker){
Thread.yield();
condition.signal();
System.out.println("blabla2");
}
}
} ;
t1.start();
t2.start();
}
}
执行将导致 a IllegalMonitorStateException
,因此 lock() 和 unlock() 方法不会在synchronized
块内隐式调用。