JMM(java內存模型)關鍵詞:原子性、可見性、有序性
原子性:要麼不做,要麼做到最好(要麼全部執行,要麼全部回滾到最初)
方案:鎖機制、無鎖CAS機制
原因:多線程操作同時操作同一資源,無法保證原子性
可見性:兩個人面試一個崗位,你幹什麼事,我也得知道
方案:volatile、synchronized、鎖
原因:多線程操作變量是在不同的內存之中,如下圖:
有序性:爲了性能優化,編譯器和處理器會進行指令衝排序,有時候會改變程序語句的先後順序
public class Singleton {
static Singleton instance;
static Singleton getInstance(){
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
對於instance=newSingleton();這條語句:
未編譯時:
-
指令1:分配一款內存M
-
指令2:在內存M上初始化Singleton對象
-
指令3:將M的地址賦值給instance變量
編譯後:
-
指令1:分配一塊內存S
-
指令2:將M的地址賦值給instance變量
-
指令3:在內存M上初始化Singleton對象