單例設計模式的八種實現方式及它們的優缺點

2021-10-23 22:18:29 字數 2805 閱讀 7674

所謂類的單例設計模式就是採取一定的方法保證某個類在整個系統中只存在乙個物件例項,並且該類只提供乙個取得其物件例項的共有的靜態方法。

單例設計模式的8種方式

餓漢式(靜態常量)

餓漢式(靜態**塊)

懶漢式懶漢式(同步方法)

懶漢式(同步**塊)

雙重檢查

靜態內部類

列舉​ 這種方式的好處就是執行緒是安全的(因為是基於classloader機制避免了多執行緒問題。),但是缺點就是沒有達到lazy loading的效果,如果這個類從系統開始執行到結束都沒有被使用,它就會造成記憶體浪費,因為從類載入的時候就已經被例項化了。

public

class

singletontest1

}class

singleton

//對外提供乙個公共的、靜態的getinstance()方法,用來獲取物件例項

public

static singleton getinstance()

}

​ 這種方式和第一種靜態常量的方式是類似的。

public

class

singletontest1

}class

singleton

//將構造方法私有化

private

singleton()

//對外提供乙個公共的、靜態的getinstance()方法,用來獲取物件例項

public

static singleton getinstance()

}

​ 懶漢式是在呼叫getinstance()方法時才進行初始化,達到了lazy loading的效果。但是當在多執行緒的情況下回建立多個例項,沒有達到乙個類只有乙個例項的效果。在實際開發中不推薦使用

public

class

singletontest1

}class

singleton

//對外提供乙個公共的、靜態的getinstance()方法,用來獲取物件例項

public

static singleton getinstance()

return instance;

}}

​ 這種方式達到了lazy loading的效果,也解決了多執行緒下執行緒不安全問題,每個執行緒都想獲得類的例項時候,執行getinstance()方法都要進行同步,而其實這個方法只需要執行一次例項化**就夠了,後面的想獲得該類例項,直接return就行了,方法進行同步效率太低了。

public

class

singletontest1

}class

singleton

//對外提供乙個公共的、靜態的getinstance()方法,用來獲取物件例項

public

static

synchronized singleton getinstance()

return instance;

}}

​ 開發中不能使用,原本是想解決同步方法的缺陷,但是不但沒有解決,反而增加了其他問題

​ double-check是多執行緒開發中經常會用到的,如**中所示,我們進行了兩次if(instancenull)檢查,這樣就可以保證執行緒安全了,而且例項化**只需要執行一次,後面再次訪問的時候判斷if(instancenull),直接return例項化物件,也避免反覆進行方法同步。使用這種方法執行緒安全、延遲載入、效率較高,在實際開發中推薦使用

public

class

singletontest1

}class

singleton

//對外提供乙個公共的、靜態的getinstance()方法,用來獲取物件例項

public

static

synchronized singleton getinstance()

}}return instance;

}}

1、這種方式通過類載入的機制保障了初始化例項時只有乙個執行緒

2、靜態內部類方式在singleton類被載入時並不會立即被例項化,

而是在需要例項化時呼叫getinstance()方法,才會裝載singletoninstance類,從而完成singletonde 例項化

3、類的靜態屬性只會在第一次類載入的時候被初始化,所以在這裡,jvm幫我們保證了執行緒的安全性,在類進行初始化的時候,別的執行緒是無法進入的

4、優點:避免了執行緒不安全,利用靜態內部類特點實現延遲載入,效率高

public

class

singletontest07

}class

singleton

public

static

class

singletoninstance

//直接返回singletoninstance.instance

public

static singleton getinstance()

}

1、這借助了jdk1.

5中新增的列舉來實現單例模式,不僅能避免多執行緒同步的問題,而且還能防止反序列化重新建立新的物件

2、推薦使用

public

class

singletontest08

}enum singleton

}

單例模式(八種實現方式)

餓漢單例 優點 簡單 執行緒安全 缺點 浪費記憶體 我們的單例物件數量不可控的時候,可能會造成記憶體浪費 public class hungraysingleton 提供全域性訪問點 public final static hungraysingleton getinstance 餓漢靜態 塊 pu...

單例設計模式的八種方式

餓漢式 靜態常量 class singleton private final static singleton instance newsingleton public static singleton getinstance 優點 類載入的時候就完成例項化,避免了執行緒同步的問題 不足 沒有懶載入...

八種單例設計模式

1.靜態常量 2.靜態 塊 1.執行緒安全 2.執行緒不安全 同步方法 3.執行緒不安全 同步 塊 單例設計模式就是在整個系統中或者程式中只有乙個該物件的應用例項。例如 public class single public static single getinstance 2 靜態 塊 步驟 1....