「最初のスレッド」と「2番目のスレッド」という用語をやや過剰に指定しました。synchronizedあなたの質問は、最初のブロックに入る最初のスレッドが2番目のブロックに入る最初のスレッドでもあることを前提としていますsynchronizedが、それを期待する理由は本当にありません.
ただし、最初のsynchronizedブロックはあまり関連性や興味深いことは何もしません — コード スニペットには mutatesはなくk、最初のsynchronizedブロックは単にそれにアクセスするだけです — したがって、それが であるという事実は無視しsynchronizedます。これにより、定義が少し単純化されます。ここで、「最初のスレッド」は 2 番目のsynchronizedブロックに入る最初のスレッドを意味し、「2 番目のスレッド」は 2 番目のsynchronizedブロックに入る 2 番目のスレッドを意味します。(ここまででよろしいですか?) その定義の話は外れました。. .
x.b他のスレッドが入って設定される可能性がないと仮定すると、trueまたは、さらに言えば、引用したスニペットの後のコードで最初のスレッドがそうする可能性がないと仮定すると、同様に、2つのスレッドが完全に異なる可能性はありません他の場所で起こっていることが原因で の結果k.get("LL")— 2 番目のスレッドは、単純に予想されるように と表示x.bされます。falseそれの訳は
あるアクションが別のアクションの前に発生する場合、最初のアクションは 2 番目のアクションよりも前に表示され、順序付けされます。
と
モニターのロック解除は、そのモニターの後続のすべてのロックの前に発生します。
(上記の引用はどちらも、The Java Language Specification , Java SE 7 Editionの§17.5.5からのものです。形式については、そのセクションとその前のセクションを参照してください。)