同期(原子の秩序の可視性)揮発性(アトミック性の可視性)
1.volatile基本的にレジスタにJVM現在の変数の値を伝える(ワーキングメモリ)が、定かではメインメモリから読み出される必要がある。同期現在の変数は、現在のスレッドのみが変数にアクセスすることができ、ロックされ、他のスレッドがありますライブ遮断します。
2.volatileは、可変レベルで使用することができ、同期変数、メソッド、クラスレベルで使用することができます。
同期および修正は、可視性とアトミック変数を確保することができます。3.volatileの可視性が唯一の変数を変更する達成することができ、原子性を保証するものではありません。
4.volatileは閉塞スレッドを引き起こすことはありません。同期閉塞スレッドを引き起こす可能性があります。
コンパイラの最適化をラベル付けされていない変数5.volatile;マークは、変数最適化コンパイラを同期させることができます。
アトミック:いわゆる原子操作は、スレッドスケジューリングメカニズムが作動中断されない意味し、この運転開始後は、それが完了するまで実行されます
例えば:INT iは= 1;この文の実行は、iの値が定数に等しくなるため、ステートメントは、アトミック操作です。
抗例:I = 0 INT; iが++;式I ++原子ではない、セキュリティ・スレッドを有するマルチスレッドは、私は++実際には3つの段階に分け、1は、変数iの値を読み取り; 2:私のプラスいずれかの操作3と変数iに割り当てられ、その後、計算値
同期:アトミック動作を保証します。図1に示すように、メインメモリ、2、3実装をロックし、メインメモリは、ワーキングメモリに書き込まれます。4.リリースロック
しかし、実行する本当の意味の同期動作とは異なる原子質量は、中断され
理由:シングルトン
揮発命令がアトミックを確保するために防ぐリオーダリング
クラスシングルトン{
プライベート(揮発性)静的シングルトンインスタンス= NULL;
パブリック静的シングルトンインスタンス(){
IF(例えば== NULL){
同期(Singleton.class){
IF(例えば== NULL)
インスタンス=新しいシングルトン(); // STEP1
}
}
戻りインスタンス。
}
}
注文:
可視性:スレッドの修正は、変数を共有する場合、他のスレッドはすぐに、この変更を見ることができます
メインメモリに変数の同期を共有する場合、変数の最新の値がスレッドがロックを取得し、メインメモリから共有されます取得、ロックが解除されます。これにより、可視性と同期。同様に、揮発性解析のメモリの可視性を達成するために添加することにより、命令の命令をロックします。このように、揮発性の可視性を持っています
参考ます。https://www.jianshu.com/p/cf57726e77f2
、HTTPS://blog.csdn.net/weixin_45110404/article/details/90453221
https://blog.csdn.net/niexianglin_csdn/article/details/47361003