類生命週期與單例

類生命週期:安全

  1. classloader將字節文件加載到jvm內存
  2. 連接(校驗,準備,解析),其中準備階段將靜態變量賦予默認值
  3. 初始化過程將靜態變量賦值(賦值過程按指令順序執行)
  4. 垃圾回收GC

單例:多線程

  1. 將構造方法私有,並提供獲取實例方法,實例爲靜態變量
  2. 獲取實例方法須要兩重判斷才能使得多線程安全得到單例(先判斷變量爲是否爲空,若空,則將類加鎖,而後再次判斷變量是否爲空,才能進行生成一個新實例),由於A線程在拿到變量爲空到準備加鎖過程當中,B線程可能已經拿到鎖進行實例化,並退出,故A線程再次進入,若是不判斷變量爲空,則會再次生成新實例
  3. 爲了更完美生成單例,還須要將1中的靜態變量加上volatile關鍵字修訂,雖然它不能控制併發,可是它能讓變量在多線程中可見,而且禁止指令重排序,假如賦值指令和初始化指令可被重排,就容易形成成員變量賦值時機不對的狀況。
相關文章
相關標籤/搜索