7

Conditionによって提供されるを使用する場合のメモリバリアについて質問がありLockます。

のjavadocでCondition提供されている例に関して、次の使用について質問があります。

int putptr, takeptr, count;

これらの属性は揮発性であると宣言されるべきではありませんか?例から理解できるように、スレッドは、たとえば、の変更を認識しない可能性がありますcount

それとも、signal()が呼び出されたときに、ロックが取得されてから行われたすべての変更が他のスレッドに表示されるということですか?synchronizedブロック内のコードのように?

はいの場合、が呼び出されたsignal()とき、またはunlock()ロックで呼び出されたときに変更が表示されますか?

ありがとう。

編集:私はのjavadocで見るLock

すべてのロック実装は、Java™言語仕様のセクション17.4で説明されているように、組み込みのモニターロックによって提供されるものと同じメモリ同期セマンティクスを適用する必要があります。

  • ロック操作が成功すると、ロックアクションが成功した場合と同じメモリ同期効果が得られます。
  • ロック解除操作が成功すると、ロック解除アクションが成功した場合と同じメモリ同期効果が得られます。

失敗したロックおよびロック解除操作、および再入可能なロック/ロック解除操作には、メモリ同期効果は必要ありません。

synchronized「ロック操作が成功すると、ブロックに入るのと同じメモリ同期効果があります」、「ロック解除操作が成功すると、ブロックを出るのと同じメモリ同期効果があります」という意味synchronizedですか?

4

1 に答える 1

7

読み込む必要がある方法は、aの前に発生するすべての書き込みがlock.unlock後続のすべてのに表示されることlock.lockです。起きているスレッドはawait、目覚めたときに本質的に機能しますlock.lock。したがって、前回のロック解除以降に発生したすべての書き込みが表示されます。

後者のポイントの状態が正しいためsignal、にはメモリセマンティクスがありません。or when unlock() is called on the lock

「ロック操作が成功すると、同期ブロックに入るのと同じメモリ同期効果があります」、「ロック解除操作が成功すると、同期ブロックを出るのと同じメモリ同期効果があります」という意味ですか?

はい、正確に!より具体的には、コンパイラはmonitorenterおよびmonitorexitバイトコード命令を発行します。

于 2013-03-10T02:34:13.367 に答える