[英]How to properly scope a lock
假设我有一个ReentrantLock
,
ReentrantLock foo = new ReentrantLock();
以及使用锁的方法bar
,
public void bar()
{
foo.lock();
try
{
methodOne();
}
finally
{
foo.unlock();
}
}
和methodOne
调用一个方法methodTwo
同样使用该锁,
public void methodTwo()
{
foo.lock();
try
{
// do something
}
finally
{
foo.unlock();
}
}
是它更好地释放锁在bar
前我打电话methodOne
? 通常,在调用另一个方法之前释放锁是一种好习惯吗?
不,您不应该那样做。 如果这样做,任何并发线程都可以在bar()
方法的中间获取锁,这正是您希望通过使用锁来避免的锁。
确切地说,它被称为ReentrantLock,因为它允许在同一线程中多次获取锁。 每次调用lock()
时,计数器都会递增,而每次调用unlock()
时,计数器都会递减,因此您只需要确保在finally块中始终调用unlock()
。
请注意,仅通过使用同步块,代码就不会那么脆弱,因为不可能忘记关闭同步块。
完成锁“保护”的关键操作后,松开锁。 不早于。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.