設計模式之單例模式

2022-10-10 21:15:21 字數 2213 閱讀 1288

懶漢式-執行緒不安全

以下實現中,私有靜態變數 uniqueinstance 被延遲例項化,這樣做的好處是,如果沒有用到該類,那麼就不會例項化 uniqueinstance,從而節約資源。

這個實現在多執行緒環境下是不安全的,如果多個執行緒能夠同時進入 if (uniqueinstance == null) ,並且此時 uniqueinstance 為 null,那麼會有多個執行緒執行 uniqueinstance = new singleton(); 語句,這將導致多次例項化 uniqueinstance。

public class singleton 

public static singleton getuniqueinstance()

return uniqueinstance;

}}

餓漢式-執行緒安全

執行緒不安全問題主要是由於 uniqueinstance 被多次例項化,採取直接例項化 uniqueinstance 的方式就不會產生執行緒不安全問題。 但是直接例項化的方式也丟失了延遲例項化帶來的節約資源的好處。

private static singleton uniqueinstance = new singleton();

懶漢式-執行緒安全

只需要對 getuniqueinstance() 方法加鎖,那麼在乙個時間點只能有乙個執行緒能夠進入該方法,從而避免了多次例項化 uniqueinstance 的問題。 但是當乙個執行緒進入該方法之後,其它試圖進入該方法的執行緒都必須等待,因此效能上有一定的損耗。

public static synchronized singleton getuniqueinstance() 

return uniqueinstance;

}

雙重校驗鎖-執行緒安全

uniqueinstance 只需要被例項化一次,之後就可以直接使用了。加鎖操作只需要對例項化那部分的**進行,只有當 uniqueinstance 沒有被例項化時,才需要進行加鎖。 雙重校驗鎖先判斷 uniqueinstance 是否已經被例項化,如果沒有被例項化,那麼才對例項化語句進行加鎖。

public class singleton 

public static singleton getuniqueinstance() }}

return uniqueinstance;

}}

考慮下面的實現,也就是只使用了乙個 if 語句。在 uniqueinstance == null 的情況下,如果兩個執行緒同時執行 if 語句,那麼兩個執行緒就會同時進入 if 語句塊內。雖然在 if 語句塊內有加鎖操作,但是兩個執行緒都會執行 uniqueinstance = new singleton(); 這條語句,只是先後的問題,那麼就會進行兩次例項化,從而產生了兩個例項。因此必須使用雙重校驗鎖,也就是需要使用兩個 if 語句。

if (uniqueinstance == null) 

}

uniqueinstance 採用 volatile 關鍵字修飾也是很有必要的。uniqueinstance = new singleton(); 這段**其實是分為三步執行。

但是由於 jvm 具有指令重排的特性,有可能執行順序變為了 1>3>2,這在單執行緒情況下自然是沒有問題。但如果是多執行緒下,有可能獲得是乙個還沒有被初始化的例項,以致於程式出錯。 使用 volatile 可以禁止 jvm 的指令重排,保證在多執行緒環境下也能正常執行。

靜態內部類實現

當 singleton 類載入時,靜態內部類 singletonholder 沒有被載入進記憶體。只有當呼叫 getuniqueinstance() 方法從而觸發 singletonholder.instance 時 singletonholder 才會被載入,此時初始化 instance 例項。 這種方式不僅具有延遲初始化的好處,而且由虛擬機器提供了對執行緒安全的支援。

public class singleton 

private static class singletonholder

public static singleton getuniqueinstance()

}

列舉實現

這是單例模式的最佳實踐,它實現簡單,並且在面對複雜的序列化或者反射攻擊的時候,能夠防止例項化多次。

public enum singleton

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...