單例模式的實現

2021-08-21 04:44:59 字數 2955 閱讀 3591

單例模式估計是咱們碰到最多也是最簡單的一種設計模式了(也是面試中經常會遇到的面試題)。單例模式保證乙個類只有乙個例項,比如咱們在android應用中登入成功之後儲存使用者資訊就會優先考慮單例模式。

單例模式有六種常規的寫法:餓漢式、懶漢式(執行緒不安全)、懶漢式(執行緒安全)、dcl雙重校驗模式、靜態內部類、列舉。

餓漢式,有兩種不同的寫法:靜態常量、靜態**塊。

餓漢式-靜態常量

public

class

singleton

/*** 靜態常量

*/private

final

static singleton instance = new singleton();

public

static singleton getinstance()

}

餓漢式-靜態**塊

public

class

singleton

/*** 靜態**塊

*/private

static singleton instance;

static

public

static singleton getinstance()

}

餓漢式實現單例有兩種方式:靜態常量、靜態**塊。兩種寫法不管是在效能上還是在效果上都是一樣的,都是在類裝載的時候完成例項化。類裝載的時候jvm保證了執行緒安全。

public

class singleton

private

static singleton instance;

public

static singleton getinstance()

return instance;

}}

這種寫法在單執行緒的程式中沒啥問題,在第一次呼叫getinstance()方法的時候建立例項(懶載入)。但是在多執行緒的情況下多個執行緒同時呼叫getinstance()函式的時候在同一時刻這些執行緒都通過了if (instance == null)的判斷,那就有可能重複建立了多個例項了。

public

class singleton

private

static singleton instance;

public

static synchronized singleton getinstance()

return instance;

}}

這種寫法給getinstance()方法新增了synchronized,告訴jvm這是個同步方法。當多個執行緒同時呼叫getinstance()方法時,同一時刻只能有乙個執行緒通過getinstance()方法,其他的執行緒只能等待。所以這種方式效率相對來說比較低。

懶漢式裡面的懶字是懶載入的懶。為了和餓漢式對應有的地方也把懶漢式叫做飽漢式。

public

class singleton

private

volatile

static singleton instance;

public

static singleton getinstance() }}

return instance;

}}

這種寫法在懶漢式(執行緒安全)方式之上做了進一步的提高。進行了兩次if (instance == null)檢查:第一次判斷是為了避免不必要的同步從而提高效率、第二次判斷之前新增了synchronized同步**塊保證了同一時刻只有乙個執行緒能進來建立例項。

public

class

singleton

/*** 靜態內部類

*/private

static

class

singletoninstance

public

static singleton getinstance()

}

這種實現方式在singleton類被裝載時並不會例項化,只有在第一次呼叫getinstance()方法的時候才會裝載內部類singletoninstance從而完成singleton的初始化,jvm保證了在類進行初始化時,別的執行緒是無法進入的。所以靜態內部類實現單例的方法是執行緒安全的。而且還起到了懶載入的作用。

列舉可以有自己的屬性,也可以有自己的方法。

這裡我假設musername來我要在單例裡面儲存的乙個屬性,之後我們可以通過singletonenum.instance.getusername();來操作單例裡面的屬性。

public

enum singletonenum

public

void

setusername(string username)

}

第二種寫法,我們額外的多乙個singleton類,singleton類裡面放我們單例要儲存的一些資訊。呼叫的時候通過singletonenum.instance.getinstance()獲取到singleton類:

額外的singleton類

public

class singleton

public

enum singletonenum

public singleton getinstance()

}

列舉例項jvm保證了執行緒安全,並且在任何情況下,它都是乙個單例。同時列舉也是在第一次使用的時候初始化,這樣也保證了懶載入。

綜上所述,綜合效率,安全等因素對於單例模式實現的選擇,我們優先推薦列舉(**簡潔),其次靜態內部類,最後是dcl雙重校驗模式。

單例模式的實現

單例設計模式保證類在記憶體中只存在乙個物件。根據不同的策略,單例類的實現有以下幾種方式。1.立即載入 在載入類的同時例項化物件,設計要點如下 1 私有化構造方法 2 宣告並例項化本類物件 靜態 3 提供公有靜態方法獲取物件。code 1 public class eagersingleton oth...

單例模式的實現

單例模式的實現需要考慮的因素有很多。對於常常出現的double checked實現單例模式實際上是不安全的實現 private static singleton instance public static singleton getinstance 因為jit可以在singleton的構造方法被執...

單例模式的實現

單例 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式是一種常用的軟體設計模式之一,其目的是保證整個應用中只存在類的唯一個例項。比如我們在系統啟動時,需要載入一些公共的配置資訊,對整個應用程式的整個生命週期中都可見且唯一,這時需要設計成單例模式。如 spring容器,session工...