Javaメモリモデルでは、関連するモニタの解放の一環としてスレッドが同期ブロックを終了するときに、JMMはローカルプロセッサキャッシュをメインメモリにフラッシュする必要があります。同様に、同期ブロックに入るときにモニタを獲得する一部として、は、ローカルキャッシュが無効にされるので、後続の読み出しはローカルキャッシュではなくメインメモリに直接行われる。同期の前にメモリを更新しますか?
このコードでは、2番目のスレッドがsynchブロックに入るとメインメモリに直接移動するので、なぜインスタンスをvolatileとして宣言しなければならないのですか?
つまり、別のスレッドが同期ブロックに入り、2番目のチェックを行うと、前述のようにメインメモリから更新されるはずです。
[Java Double Checked Locking](http://stackoverflow.com/q/1625118/651140) –
[この「Double-Checked Lockingが壊れています」という宣言]を読まずにこのコードにどのように到達しますか? http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)?すべてが簡単に理解できる用語で説明されています。 – Ringding
より多くの説明をしてください...私は、同期ブロックのローカルキャッシュに入るときのスレッドは無効になるので、後続の読み込みはメインメモリに直接行くので、スレッドBは揮発性でなくてもメインメモリからそのインスタンス値を更新するはずです。 – Dorgham