1. 程式人生 > >劍指offer-1單例模式

劍指offer-1單例模式

單例模式所實現的就是隻允許這個類生成一個例項

單例模式有兩種,分為懶漢式和餓漢式。

 

餓漢式呢,就是一旦載入該類,不管有沒有用到該例項,就先創建出該類的一個唯一例項,這個是天生執行緒安全的。

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; } }