javadocを正しく解釈しているかどうかはわかりません。ReentrantLock
メソッドを呼び出してロックを正常に取得した後を使用する場合lock
、同期されたブロックなしで任意のオブジェクトにアクセスでき、発生前の関係が魔法のように強制されますか?
と作業中のオブジェクトの間に関連性が見当たらないためReentrantLock
、安全に作業できるとは信じられません。しかし、これは事実ですか、それとも私はjavadocを間違って読んでいますか?
javadocを正しく解釈しているかどうかはわかりません。ReentrantLock
メソッドを呼び出してロックを正常に取得した後を使用する場合lock
、同期されたブロックなしで任意のオブジェクトにアクセスでき、発生前の関係が魔法のように強制されますか?
と作業中のオブジェクトの間に関連性が見当たらないためReentrantLock
、安全に作業できるとは信じられません。しかし、これは事実ですか、それとも私はjavadocを間違って読んでいますか?
スレッドAがロックによって保護されたコードブロックCB1内のオブジェクトを変更してからロックを解放し、スレッドBが同じロックによって保護されたコードブロックに入った場合、スレッドBはコード内のスレッドAによって行われた変更を確認します。ブロックCB1。
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つのスレッドによってのみ実行されることが保証されます。
そこには魔法はありません。オブジェクトにアクセスするすべてのスレッドが同じロックを使用している場合に限り、安全です。それは、ブロックReentrantLock
などの他のミューテックスです。synchronized
存在ReentrantLock
は、それがより多くの柔軟性を提供することによって正当化されますsynchronized
:たとえば、単にロックを取得しようとすることができます-では不可能synchronized
です。