【发布时间】:2014-12-13 15:56:07
【问题描述】:
我读过this topic 和这篇blog article 关于尝试使用资源 锁的内容,因为这个问题突然出现在我的脑海中。 但实际上,我更喜欢尝试使用锁,我的意思是没有锁实例化。它会让我们从冗长的
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){} 块之间的区别,请检查这个 sn-p :
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();
}
}
执行将导致IllegalMonitorStateException,因此在synchronized 块内不会隐式调用lock() 和unlock() 方法。
【问题讨论】:
-
synchronized不就是这样做的吗? -
注意
lock.lock()和synchronized (lock)是完全不同的。 -
是的,我在编辑中描述的用户案例正在等待退出线程空闲的条件。但显然这不是一种普遍的做法。
标签: java locking deadlock try-with-resources