【发布时间】:2015-07-25 16:13:55
【问题描述】:
我发现使用 ReentrantLock 而不是同步的另一个好处
下面的代码显示即使在临界区发生异常锁被释放(使用 ReentrantLock )
void someMethod() {
//get the lock before processing critical section.
lock.lock();
try
{
// critical section
//if exception occurs
}
finally
{
//releasing the lock so that other threads can get notifies
lock.unlock();
}
}//end of method
现在使用同步
void someMethod() {
//get the lock before processing critical section.
synchronized(this)
{
try
{
// critical section
//if exception occurs
}
finally
{
//I don't know how to release lock
}
}
}//end of method
通过比较两个代码,我发现使用同步块还有一个缺点 即如果在临界区发生异常,则无法释放锁。
我说的对吗?
如果我错了,请纠正我。
如果同步块中发生异常,是否有释放锁?
【问题讨论】:
-
好的,如果同步块中间发生异常,则释放锁。对吗?(根据你给我的链接)@s.bandara
-
内部锁将在
synchronized块的右括号执行后释放,你不需要显式地这样做 -
@JavedSolkar,正确!
-
@s.bandara 好的,我明白了
-
投票重新开放,因为另一个问题没有说明 ReentrantLock 的好处。
ReentrantLock比synchronized更强大。这使得它在某些情况下“有益”,但它也使它成为一个危险的工具。它的权力是; (a) 您可以将锁定与解锁分离(即,这些事情可能以完全不同的方法发生); (b) 您可以将两个或多个单独的条件变量与同一个锁相关联。第 (b) 点在多生产者、多消费者应用程序中尤为重要。
标签: java multithreading reentrantlock synchronized-block