單例模式雙重校驗鎖 碼住!單例模式的六種實現方式

2021-10-11 23:38:02 字數 2345 閱讀 1139

//餓漢式實現單例模式

public class hungry

private static hungry hungry = new hungry();

public static hungry gethungry()

}

優點:實現簡單,類載入的時候就完成了例項化,避免了執行緒的同步問題

缺點:無法實現延遲載入,可能會造成記憶體的浪費(浪費可忽略)

//懶漢式實現單例模式

public class lazysingleton01

private static lazysingleton01 lazy ;

public static lazysingleton01 getlazy()

return lazy;}}

//懶漢式+同步方法實現單例模式

public class lazysingleton02

private static lazysingleton02 lazy;

public static synchronized lazysingleton02 getlazy()

return lazy;}}

執行緒安全,效率低不推薦使用

對於上述缺陷的改進可能有的人會想到如下的**:

public class lazysingleton03 

private static lazysingleton03 lazy;

public static lazysingleton03 getlazy()

}return lazy;}}

該寫法一樣是執行緒不安全的,當乙個執行緒還沒有例項化lazysingleton03時,另乙個執行緒執行到if(lazy==null)這個判斷語句時就會進入if語句,雖然加了鎖,但是等到第乙個執行緒執行完lazy=new lazysingleton03()釋放出這個鎖時,另乙個進入if語句的執行緒同樣會例項化另外乙個lazysingleton03物件。

經過一步步的探索,有了雙重校驗鎖的懶漢式寫法:

//雙重校驗鎖+懶漢式

public class doublechecksingleton

private volatile static doublechecksingleton instance;

public static doublechecksingleton getinstance()}}

return instance;}}

優點:執行緒安全,延遲載入,效率較高

注意此處的volatile:

//雙重校驗鎖+懶漢式

public class doublechecksingleton

private volatile static doublechecksingleton instance;

public static doublechecksingleton getinstance()}}

return instance;}}

解決這個方法很簡單,加乙個關鍵字volatite這個關鍵字能夠保證例項化的順序的相對位置不變,instance例項化永遠在socket之後

//靜態內部類實現單例模式

public class staticinner

private static class inner

public static staticinner getinstance()

}

優點:避免了執行緒不安全,延遲載入,效率高

詳解:這個方法並沒有事先宣告instance的靜態成員,而是把它放到了靜態內部類inner中,inner中定義了靜態變數,並直接進行了例項化,當inner被主動引用的時候就會建立例項,staticinner在例項建立過程中被收集到()方法中,這個方法是同步方法,

保證了記憶體的可見性,jvm指令的順序執行和原子性。該方法也是單例模式的最好設計之一。

//列舉實現單例模式

public enum enumsingleton

public void method(){}

}

借助jdk1.5中新增的列舉來實現單例模式優點:不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件,實現非常簡單而且最安全可謂很完美。

單例模式 雙重校驗鎖

單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...

雙重校驗鎖實現單例模式

1 先上 public class singleton public static singleton getinstance return instance 2 分析 第一次校驗 instance null 單例模式只需要建立乙個例項,假如例項不為空則不需要去競爭鎖,提高效能 第二次校驗 inst...

單例雙重校驗鎖

public class singledoublelock 1 第一次校驗 因為該類是單例的只建立一次,大部分時間single都不為空,所以不會進行第一次檢驗的 塊內部,從而提高效率 2 第二次校驗 如果single為空,執行緒t1,t2進入第一次檢驗的 塊,t1執行synchronized 塊 n...