1對象的創建過程
源碼:
class T{
int m=9;
}
T t=new T();
T t=new T();的彙編碼:
0 new #2 <T> //半初始化 確定具體內存大小 m的值初始爲0
3 dup
4 invokespecial #3 <T.<init>> //具體賦值 將m的值 初始爲9
7 astore_1 //賦值 將new T()對象賦值給t
8 return
此處如果不加volatile關鍵字,一行new對象的代碼(對應好幾行彙編碼) 有可能會發生代碼重排序(cpu亂序執行)。
這裏也是單例模式 爲啥單例對象要加volatile關鍵字的原因:防止一個線程創建對象時,此時對象處於半初始化狀態,同時其他線程進入(其他的線程判斷時 該對象已經不爲null),返回一個半初始化對象。