JAVA單例模式詳解

2021-09-12 21:57:31 字數 3281 閱讀 1880

什麼是單例模式:單例模式(singleton pattern)是指確保乙個類在任何情況下都絕對只有乙個例項,並

提供乙個全域性訪問點。單例模式是建立型模式。

public class hungrysingleton 

public static hungrysingleton getinstance()

}

還有另外一種寫法,利用靜態**塊的機制:

//餓漢式靜態塊單例

public class hungrystaticsingleton

private hungrystaticsingleton(){}

public static hungrystaticsingleton getinstance()}}

這兩種寫法都非常的簡單,也非常好理解,餓漢式適用在單例物件較少的情況。

下面我們來看效能更優的寫法。

二 、懶漢式單例

懶漢式單例的特點是:被外部類呼叫的時候內部類才會載入,下面看懶漢式單例的簡單

實現lazy******singleton:

//懶漢式單例

//在外部需要使用的時候才進行例項化

public class lazy******singleton

//靜態塊,公共記憶體區域

private static lazy******singleton lazy = null;

public static lazy******singleton getinstance()

return lazy;}}

然後寫乙個執行緒類exectorthread 類:

public class exectorthread implements runnable

}

客戶端測試**:

然後,給lazy******singleton 類打上斷點,同樣標記為thread 模式:

切回到客戶端測試**,同樣也打上斷點,同時改為thread 模式,如下圖:

開始debug 之後,會看到debug 控制台可以自由切換thread 的執行狀態:

//靜態塊,公共記憶體區域

private static lazy******singleton lazy = null;

public synchronized static lazy******singleton getinstance()

return lazy;}}

三、雙重檢查鎖+volatile的單例模式:

public class lazydoublechecksingleton 

public static lazydoublechecksingleton getinstance()}}

return lazy;}}

除錯執行緒,當第乙個執行緒呼叫getinstance()方法時,第二個執行緒也可以呼叫getinstance()。當第乙個執行緒執行到synchronized 時會上鎖,第二個執行緒就會變成monitor 狀態,出現阻塞。此時,阻塞並不是基於整個lazy******singleton 類的阻塞,而是在getinstance()方法內部阻塞,只要邏輯不是太複雜,對於呼叫者而言感知不到。但是,用到synchronized 關鍵字,總歸是要上鎖,對程式效能還是存在一定影響的

四 、holer方式的單例模式:

holder方式完全借助了類載入的特點,採用靜態內部類的方式:

//這種形式兼顧餓漢式的記憶體浪費,也兼顧synchronized 效能問題

//完美地遮蔽了這兩個缺點

public class lazyinnerclasssingleton

//每乙個關鍵字都不是多餘的

//static 是為了使單例的空間共享

//保證這個方法不會被重寫,過載

public static final lazyinnerclasssingleton getinstance()

//預設不載入

private static class lazyholder

}

在lazyinnerclasssingleton中沒有 lazy的靜態成員,而是放入到lazyholder 內部類中,因此在lazyinnerclasssingleton初始化的時候並不會建立 lazyinnerclasssingleton例項,lazyholder中定義了lazyinnerclasssingleton的靜態變數並例項化,只有當lazyholder被主動引用時才去建立lazyinnerclasssingleton例項,內部類一定是要在方法呼叫之前初始化,巧妙地避免了執行緒安全問題。

五 列舉方式的單例:

列舉型別不允許被繼承,同樣是執行緒安全的且只能被例項化一次,但是列舉不能夠懶載入。

public enum enumsingleton 

}

但是我們可以通過改造,增加懶載入特性,**如下:

public calss enumsingleton 

private enum enumholer

private enumsingleton getsingleton()

}public static enumsingleton getinstance()

}

參考資料來自沽泡學院tom

Java單例模式詳解

設計模式有很多種,相信大家用的最多的應該是單例設計模式,也是應用最為廣泛的設計模式。下面將帶領大家來學習下。singleton是一種建立型模式,指某個類採用singleton模式,則在這個類被建立後,只可能產生乙個例項供外部訪問,並且提供乙個全域性的訪問點。乙個單例模式的核心是什麼?將採用單例設計模...

java 單例模式詳解

單例物件的類必須保證只有乙個例項存在 這是維基百科上對單例的定義,這也可以作為對意圖實現單例模式的 進行檢驗的標準。對單例的實現可以分為兩大類 懶漢式和餓漢式,他們的區別在於 singleton類稱為單例類,通過使用private的建構函式確保了在乙個應用中只產生乙個例項,並且是自行例項化的 在si...

Java設計模式詳解之單例模式

解決的問題 保證乙個類在記憶體中的物件唯一性。eg 多程式讀取乙個配置檔案時,建議配置檔案封裝成物件。會方便操作其中資料,又要保證多個程式讀到的是同乙個配置檔案物件,就需要該配置檔案物件在記憶體中是唯一的。不讓其他程式建立該類物件。在本類中建立乙個本類物件。對外提供方法,讓其他程式獲取這個物件。pu...