Java同時-volatileとsynchronized
volatile
機能
とくせい
volatileには以下の特性がある.volatileタグの変数は、読み込み操作時に最新の値に違いありません.どうして?1、lock接頭辞のサポート、volatileは変更操作のたびにメモリにリフレッシュし、読み取り操作もメモリに新しい値を取りに行くことを規定している.2、バスのサポート、複数のバストランザクションが同じ時刻に同じ時刻にメモリにアクセスできる権限は1つしかありません.そのため、スレッドが修正された限り、読み取り操作は必ず新しい値を取ります.###メモリの意味:volatile変数を読むと、JMMはスレッドに対応するローカルメモリを無効にします.スレッドは次にメインメモリから共用変写を読み込みます.volatile変数を書くと、JMMはそのスレッドに対応するローカルメモリの共用変数値をメインメモリにリフレッシュします.
げんり
instance = new Singleton(); // instance volatile
0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: **lock** addl $0×0,(%esp);
lock接頭辞の命令はマルチコアプロセッサの下で2つの操作をトリガーします
CPU依存キャッシュ整合性のサポート
volatileルールテーブル
2番目の操作がvolatileで書かれている場合、1番目の操作が何であれ、並べ替えることはできません.このルールは、volatile書き込み前の操作がコンパイラによってvolatile書き込み後に並べ替えられないことを保証します.最初の操作がvolatile読みである場合、2番目の操作が何であるかにかかわらず、並べ替えることはできません.このルールは、volatileの読み取り後の操作がコンパイラによってvolatileの読み取り前に並べ替えられないことを保証します.最初の操作がvolatileで書き、2番目の操作がvolatileで読む場合、並べ替えることはできません
各volatile書き込み操作の前にStoreStoreバリアを挿入します.各volatile書き込み操作の後ろにStoreLoadバリアを挿入します.各volatile読み取り操作の後ろにLoadLoadバリアを挿入します.各volatile読み取り操作の後ろにLoadStoreバリアを挿入します.
synchronized
使用
げんり
げんしせい
コアコード
do{
N = E+1;
}while(CASXXXX((E,N));
JAva concurrentパッケージのatomicクラス
AtomicInteger AtomicBoolean...(CAS, BAB )
AtomicStampedReference CAS ABA