同步最基本的目的是保證原子性。另乙個容易忽略的目的是可見性,即乙個執行緒修改的共享資料對另乙個執行緒可見。
因為一些基本型別的賦值操作本身是原子的。所以針對這些賦值操作在不使用synchronized的情況下,可以使用volatile來解決乙個執行緒的修改對另乙個執行緒的可見。 所以volatile是在能保證原子性的前提下,避免使用synchronized解決可見性的辦法。
private static volatile int nextserialnumber = 0;
public static int generateserialnumber()
改進:private static int nextserialnumber = 0;
//如果使用synchronized,volatile就可以省略了。後者一樣可以保證可見性。
synchronized public static int generateserialnumber()
或者://atomiclong是cam機制保證可見性與原子性。
private static final atomiclong nextserialnum = new atomiclong();
public static long generateserialnumber()
原子性,可見性,有序性
1.原子性 read,load,assign,use,store write 基本型別的訪問,讀寫 long,double 非原子性協定 monitorenter,monitorexit jvm lock,unlock,synchronized 2.可見性 volatile synchronized...
synchronize的可見性和原子性
synchronize 可以保證變數可見性和一段 的原子性 jmm關於synchronized的兩條可見性規定 執行緒解鎖前,必須把共享變數的最新值重新整理到主記憶體中 執行緒加鎖時,將清空工作記憶體中共享變數的值,從而使用共享變數時需要從主記憶體中重新讀取最新的值 參考 reentrantlock...
JMM的可見性和原子性
乙個方法中相鄰的2行 不一定按從上到下的順序執行 jmm允許編譯器和處理器對指令重排序。as if serial語義 不管怎麼重排序 編譯器和處理器為了提高並行度 單執行緒 程式的執行結果不能被改變。編譯器 runtime和處理器都必須遵守as if serial語義。編譯器和處理器不會對存在資料依...