保證執行緒可見性 【不能代替synchronized 保證原子性】
禁止指令重排序 細節與cpu有關
雙重判斷單例 要不要加volatile 需要 一定需要 防止指令重排 【synchronized 不能防止重排序】
public
class
singletonclass}}
return instance;
}private
singletonclass()
}
原因分析:
new 物件過程 大致三步
object o = new object();
申請記憶體空間(隱式初始化。預設值)
顯示初始化
引用賦值 (賦值給o)
指令重排 可能導致第三步先於第二步執行,instance 在顯示初始化前已經有值了,在極高併發下 第乙個instance == null 判斷為假 直接取到了物件,但是這個物件還沒有顯示初始化,資料有問題
volatile的作用和舉例
1 作用 作為指令關鍵字,確保本條指令不會因為編譯器的優化而省略,要求每次直接讀值。舉例 int a 10 a 5 a 3 如果不加volatile,編譯器會認為a 3,所以上面兩條指令不會產生機器 2 習題 1 乙個引數既可以是const還可以是volatile嗎?解釋為什麼。2 乙個指標可以是v...
volatile的作用及理解
被volatile 修飾的變數 不存在原子性 因為他的讀操作和寫操作是分開的,所以並不是執行緒安全的.必須同時滿足下面兩個條件才能保證在併發環境的執行緒安全 1 對變數的寫操作不依賴於當前值。比方說 i 就會失效 但是 q b 1 b用volatile 修飾就沒事 2 該變數沒有包含在具有其他變數的...
命名空間的作用及程式設計舉例
學校的人事部門儲存了有關學生的部分資料 學號 姓名 年齡 住址 教務部門也儲存了學生的另外一些資料 學號 姓名 性別 成績 兩個部門分別編寫了本部門的學生資料管理程式,其中都用了student 作為類名。現在要求在全校的學生資料管理程式中呼叫這兩個部門的學生資料,分別輸出兩種內容的學生資料。要求用 ...