Condition
によって提供されるを使用する場合のメモリバリアについて質問がありLock
ます。
のjavadocでCondition
提供されている例に関して、次の使用について質問があります。
int putptr, takeptr, count;
これらの属性は揮発性であると宣言されるべきではありませんか?例から理解できるように、スレッドは、たとえば、の変更を認識しない可能性がありますcount
。
それとも、signal()
が呼び出されたときに、ロックが取得されてから行われたすべての変更が他のスレッドに表示されるということですか?synchronized
ブロック内のコードのように?
はいの場合、が呼び出されたsignal()
とき、またはunlock()
ロックで呼び出されたときに変更が表示されますか?
ありがとう。
編集:私はのjavadocで見るLock
:
すべてのロック実装は、Java™言語仕様のセクション17.4で説明されているように、組み込みのモニターロックによって提供されるものと同じメモリ同期セマンティクスを適用する必要があります。
- ロック操作が成功すると、ロックアクションが成功した場合と同じメモリ同期効果が得られます。
- ロック解除操作が成功すると、ロック解除アクションが成功した場合と同じメモリ同期効果が得られます。
失敗したロックおよびロック解除操作、および再入可能なロック/ロック解除操作には、メモリ同期効果は必要ありません。
synchronized
「ロック操作が成功すると、ブロックに入るのと同じメモリ同期効果があります」、「ロック解除操作が成功すると、ブロックを出るのと同じメモリ同期効果があります」という意味synchronized
ですか?