たとえば、シングルトン モードを作成する場合は、sycrynized 同期メソッドを使用せず、揮発性変更を使用します。
プライベート シグルトン(){
}
プライベート静的揮発性 Sigleton s = null;
パブリック静的 Sigleton getInstance(){
リーリー
}
これでスレッドの安全性の問題は解決できるでしょうか?
スレッドの可視性を理解する方法
s==null の場合に 2 つのスレッドが同時に入ってくると、最終的に 2 つの新しい sigleton オブジェクトが作成されませんか?
new のオーバーヘッドが非常に小さい場合は、このように書いてもまったく問題ありません。ただし、初期化のオーバーヘッドが高い場合は、依然として synchronized を使用する必要があります。典型的な 二重チェックされたロック は次のように記述されます:
リーリーまずメモリモデルを理解してください。
スレッドはメイン メモリ内の変数を直接変更しませんが、最初に独自の作業メモリを書き込み、次にそれをメイン メモリに同期します。同期されていない場合、他のスレッドは変更を認識しません (スレッドは引き続きその変更を参照します)。作業メモリの独自のキャッシュ)。