以下は、JMM の 3 つの「事前発生」ルールです。私の質問はこれら 3 つのルールのみに関連しているため、他のルールは記載していません。
- ロック規則を監視します。モニター ロックのロック解除は、同じモニター ロックの後続のすべてのロックの前に行われます。
- スレッド開始規則。スレッドでの Thread.start の呼び出しは、開始されたスレッドのすべてのアクションの前に発生します。
- 中断ルール。別のスレッドで割り込みを呼び出すスレッドは、割り込みを受けたスレッドが (InterruptedException をスローするか、isInterrupted または interrupted を呼び出すことによって) 割り込みを検出する前に発生します。
質問
第 1 のルールの質問 - 2 つのスレッド A と B が同期したコード ブロックを持っているとします。最初のルールは、変数が volatile として宣言されていなくても、スレッド A の同期ブロックに設定された変数は、スレッド B の同期ブロックのコードから見えるということですか?
2 番目のルールの質問- スレッド A がスレッド B を開始するとします。2 番目のルールは、変数が volatile として宣言されていなくても、start() を呼び出す前に親スレッドに設定された変数がスレッド B に見えることを意味しますか?
3 番目の規則の質問- スレッド A がスレッド B に割り込むとしましょう。揮発性?
最後に、もう 1 つ質問します。
- BlockingQueue のドキュメントでは、次のように述べられています。
メモリの一貫性の影響: 他の並行コレクションと同様に、オブジェクトを BlockingQueue に配置する前のスレッド内のアクションは、別のスレッド内の BlockingQueue からのその要素へのアクセスまたは削除に続くアクションの前に発生します。
これは、変数が揮発性として宣言されていなくても、オブジェクトをブロック キューに入れる前にスレッド A に設定された変数が、キューからオブジェクトをデキューした後にスレッド B に見えることを意味しますか?
基本的に上記の質問を通じて、これらの場合に変数を volatile として宣言する必要がないように、これらのイベントの後にメモリ フラッシュが発生するかどうかを理解しようとしています。