如何正确地锁定范围

时间:2013-02-16 17:07:52

标签: java scope reentrantlock

假设我有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发布锁定吗?一般来说,在调用另一个方法之前释放锁是好的做法吗?

2 个答案:

答案 0 :(得分:3)

不,你不应该这样做。如果你这样做,任何并发线程都可以在bar()方法的中间获取锁,这正是你想通过使用锁来避免的。

它被称为ReentrantLock,因为它允许在同一个线程中多次获取锁。每次调用lock()时计数器都会递增,并且每次调用unlock()时递减计数,因此您只需要确保始终在finally块中调用unlock()

请注意,只需使用synchronized块就可以减少代码的脆弱性,因为忘记关闭同步块是不可能的。

答案 1 :(得分:2)

完成锁定“保护”的关键操作后释放锁定。不久。