類生命週期與單例
類生命週期:安全
- classloader將字節文件加載到jvm內存
- 連接(校驗,準備,解析),其中準備階段將靜態變量賦予默認值
- 初始化過程將靜態變量賦值(賦值過程按指令順序執行)
- 垃圾回收GC
單例:多線程
- 將構造方法私有,並提供獲取實例方法,實例爲靜態變量
- 獲取實例方法須要兩重判斷才能使得多線程安全得到單例(先判斷變量爲是否爲空,若空,則將類加鎖,而後再次判斷變量是否爲空,才能進行生成一個新實例),由於A線程在拿到變量爲空到準備加鎖過程當中,B線程可能已經拿到鎖進行實例化,並退出,故A線程再次進入,若是不判斷變量爲空,則會再次生成新實例
- 爲了更完美生成單例,還須要將1中的靜態變量加上volatile關鍵字修訂,雖然它不能控制併發,可是它能讓變量在多線程中可見,而且禁止指令重排序,假如賦值指令和初始化指令可被重排,就容易形成成員變量賦值時機不對的狀況。
歡迎關注本站公眾號,獲取更多信息