劍指offer-1單例模式
阿新 • • 發佈:2018-12-09
單例模式所實現的就是隻允許這個類生成一個例項
單例模式有兩種,分為懶漢式和餓漢式。
餓漢式呢,就是一旦載入該類,不管有沒有用到該例項,就先創建出該類的一個唯一例項,這個是天生執行緒安全的。
public class Singleton1 { private Singleton1(){}//私有的建構函式,防止外部呼叫構造器建立例項 private static Singleton1 instance = new Singleton1();//靜態的唯一例項,因為靜態修飾的東西只在類初始化的時候被載入一次 public static Singleton1 getInstance(){return instance; } }
懶漢式呢,就是按需建立例項,當需要用到該類例項的時候就去建立,用不到永遠也不會去建立。採用了雙重校驗鎖,在多執行緒環境下也是安全的。
public class Singleton2 { private Singleton2(){} private static Singleton2 instance = null;//先定義一個空的例項變數 public static Singleton2 getInstance(){//雙重校驗鎖 if(instance == null){//第一道屏障是做一個簡單的過濾,看是否有建立好的例項,這個在單執行緒環境下可行,但是多執行緒環境下就會出問題。synchronized(Singleton2.class){//加鎖,確保同一時刻只有一個執行緒執行該部分程式碼 /* *第二道屏障,這個是在多執行緒環境下,如果多個執行緒越過了第一道屏障, 而且其中已經有一個執行緒已經獲得了鎖進入了, *但是還沒有建立例項,當這個執行緒釋放鎖以後,其他執行緒搶奪,搶到鎖的執行緒進入再進行判斷,發現例項已經被建立,這時候直接返回 */ if(instance == null){ instance= new Singleton2(); } } } return instance; } }