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()され、が呼び出されるたびにデクリメントされるため、finallyブロックで常に呼び出されるunlock()ことを確認する必要があります。unlock()

同期されたブロックを閉じることを忘れることはできないため、同期されたブロックを使用するだけでコードの脆弱性が低くなることに注意してください。

于 2013-02-16T17:47:41.143 に答える
2

ロックが「保護」する重要な操作が完了したら、ロックを解除します。すぐに。

于 2013-02-16T18:31:33.073 に答える