1

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

4

2 回答 2

3

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

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

请注意,只需使用同步块,代码就不会那么脆弱,因为不可能忘记关闭同步块。

于 2013-02-16T17:47:41.143 回答
2

当锁“保护”的关键操作完成时释放锁。不早于。

于 2013-02-16T18:31:33.073 回答