每天一模式 單例模式

2021-06-18 07:22:05 字數 1104 閱讀 3555

一、單例模式是為了控制類只有乙個例項物件,通常在以下兩種情況需要考慮使用單例模式:

1、業務邏輯的需求

2、效能的考慮

二、單例模式的機構圖:

三、單例模式的幾種實現形式:

1、形式一

public class singleton2 

public static singleton2 getinstance()

return instance;

}}

2、形式二

public class singleton 

public static singleton getinstance()

}

注意:對於第一種形式來說,其最大的問題是不適合於多執行緒模式。

3、形式三——改進形式一,使其在多執行緒模式下能正常執行:

public class singleton2 

public synchronized static singleton2 getinstance()

return instance;

}}

加上關鍵字synchronized後,確實能保證執行緒的安全,但是存在的問題是,驗證影響效率,因為同步整個方法,會使得所有的執行緒需要順序執行,不能併發執行。

4、形式四——修正形式三,提高效率:

public class singleton2 

public static singleton2 getinstance()}}

return instance;

}}

這段**的核心是:雙重檢查並加鎖。雙重檢查的作用在於不需要同步整個方法,可以併發執行程式,並且在加鎖的情況下可以保證執行緒的安全。這個地方還需要注意的關鍵字是volatile,但是該關鍵字僅僅能保證讀取的是最新指值,而無法保證原子性操作,更不能保證同步。因為在jvm中每個執行緒有自己的記憶體空間,正常情況下,該記憶體區間會儲存堆中變數的乙個副本,然後完成操作後寫回堆中,使用volatile關鍵能保證不使用執行緒的快取,而直接讀取堆中的值。從而保證每次讀取的值是最新的值,但是有可能同時兩個執行緒讀取了該變數,然後再依次修改該變數。

每天乙個設計模式之單例模式

單例模式 確保某個類只有乙個例項,並且只能自行例項化並且向系統提供這個示例。單例模式有幾個特點 單例模式在很多場景都可以使用到,比如執行緒池 快取 日誌物件 印表機或者顯示卡驅動的物件等等,這些場景下,如果有多個例項的話,可能會導致程式的行為異常 資源使用過量等問題的出現。因此,學習單例模式是很有必...

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

一天乙個設計模式 單例模式

1.餓漢模式public class sprivate static s s news public static s get 執行緒安全,載入時就初始化,根據需求來,此種用法最簡單2.懶漢模式public class sprivate static s s public static s get ...