全て:
以下は有名な記事です。
Java ではパターンが機能しないことを宣言します。さらに、末尾近くで、新しい JVM は volatile を使用してパターンを機能させることができると述べています。
ただし、別の記事: Memory Barriers and JVM Concurrency
キーワード「同期」により、メモリバリアフルフェンスが生成されると書かれています。では、誰が正しいのでしょうか? パターンはJavaで地球上で機能しますか?
全て:
以下は有名な記事です。
Java ではパターンが機能しないことを宣言します。さらに、末尾近くで、新しい JVM は volatile を使用してパターンを機能させることができると述べています。
ただし、別の記事: Memory Barriers and JVM Concurrency
キーワード「同期」により、メモリバリアフルフェンスが生成されると書かれています。では、誰が正しいのでしょうか? パターンはJavaで地球上で機能しますか?
二重チェックのロックを修正するには、基本的に 3 つの方法があります。
変数が揮発性として宣言されていることを確認します(Java 5 以降で動作します)。
そもそもそれを気にしないでください。ただ同期を使用し、それを「回避」するための、バグが発生しやすい (そしておそらく無意味な) 派手な手段をいじろうとしないでください。
クラスローダに同期を任せてください。
ここにコード例を投稿しました。
BUT:ダブルチェック ロックは、実際に Java で有用であったとしても、時代遅れのパラダイムです。私が見ているように、それは本質的に C プログラマーによって Java に持ち込まれました。C プログラマーは、JVM がクラスローダーに組み込まれた問題を効果的に処理するより効率的な (そして正しい!) 方法を持っていること、および同期の最適化が通常、JVM レベルで作成するのが最適です。
多くの人がこの「パターン」でコードを乱雑にするのを見てきました。効果があることを示す実際のデータを見たことがないと思います。
さらに、同期の問題が発生している大規模なアプリケーションがある場合、Java の存在理由の 1 つは、豊富な同時実行ライブラリがあることです。それらを使用するためにアプリケーションを再加工する方法を見てください...データのプロファイリングが必要であることが判明した場合。
使用している Java のバージョンによって異なります。これは、Java 5 以降で修正されています。
http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java を確認してください
どちらも正しく、DCL は 5 以降の Java で正常に動作します。
プログラムがまったく同じ入力に対して毎回まったく同じ出力を生成することを期待していて、DCL を使用している場合は、何をしているかを真剣に考え直す必要があるかもしれません。誰が最初にロックに到達するかによって、非常に多くのことが左右される可能性があります。あなたはたくさんのサイコロを振っています。会計アプリには向いていません。
ボールが壁に当たって跳ねたり、お互いに跳ね返ったりするプログラムの場合、DCL は非常に理にかなっている可能性があります。それは機能します。競合がなくても、同期は非同期よりも少し遅くする必要がありif
ます。また、必要なオブジェクトが既に存在するときに 100 のスレッドが synch ステートメントに積み重なると、処理速度が大幅に低下します。