1

javadocを正しく解釈しているかどうかはわかりません。ReentrantLockメソッドを呼び出してロックを正常に取得した後を使用する場合lock、同期されたブロックなしで任意のオブジェクトにアクセスでき、発生前の関係が魔法のように強制されますか?

と作業中のオブジェクトの間に関連性が見当たらないためReentrantLock、安全に作業できるとは信じられません。しかし、これは事実ですか、それとも私はjavadocを間違って読んでいますか?

4

3 に答える 3

4

スレッドAがロックによって保護されたコードブロックCB1内のオブジェクトを変更してからロックを解放し、スレッドBが同じロックによって保護されたコードブロックに入った場合、スレッドBはコード内のスレッドAによって行われた変更を確認します。ブロックCB1。

2つのスレッドが同じ共有状態の読み取りと書き込みを行う場合、この状態へのすべての読み取りと書き込みは同じロックで保護する必要があります。

于 2011-10-29T16:59:00.403 に答える
2

それは...(ミューテックス)ロックです:

void myMethod()
{

    myLock.lock();  // block until condition holds
    try 
    {
         // Do stuff that only one thread at a time should do
     } 
     finally 
     {
         myLock.unlock()
     }
}

lock()一度に1つのスレッドのみがロックを保持できるため、と呼び出しの間のすべてがunlock()一度に1つのスレッドによってのみ実行されることが保証されます。

関連するOracleチュートリアルはここにあります。

于 2011-10-29T16:58:34.963 に答える
2

そこには魔法はありません。オブジェクトにアクセスするすべてのスレッドが同じロックを使用している場合に限り、安全です。それは、ブロックReentrantLockなどの他のミューテックスです。synchronized

存在ReentrantLockは、それがより多くの柔軟性を提供することによって正当化されますsynchronized:たとえば、単にロックを取得しようとすることができます-では不可能synchronizedです。

于 2011-10-29T16:59:04.247 に答える