假设我有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
发布锁定吗?一般来说,在调用另一个方法之前释放锁是好的做法吗?
答案 0 :(得分:3)
不,你不应该这样做。如果你这样做,任何并发线程都可以在bar()
方法的中间获取锁,这正是你想通过使用锁来避免的。
它被称为ReentrantLock,因为它允许在同一个线程中多次获取锁。每次调用lock()
时计数器都会递增,并且每次调用unlock()
时递减计数,因此您只需要确保始终在finally块中调用unlock()
。
请注意,只需使用synchronized块就可以减少代码的脆弱性,因为忘记关闭同步块是不可能的。
答案 1 :(得分:2)
完成锁定“保护”的关键操作后释放锁定。不久。