JAVA設計模式 單例模式之七種常見寫法分析

2021-09-19 03:42:10 字數 1660 閱讀 2344

簡介

單例模式是一種常見的設計模式,其定義是單例物件的類,在虛擬機器中只執行乙個例項存在。在多執行緒環境下,應該提供一定的機制,確保只會產生乙個例項

一、餓漢式--靜態變數(推薦)

public class mysingleton1 

private mysingleton1()

}

此方法利用了jvm的類載入機制,確保了單例物件只會被例項化一次,保證了執行緒安全。同時,在mysingleton1類被載入時,就完成了例項化,沒有達到懶載入的效果。假設始終沒有用法該示例,則會造成浪費記憶體資源。

二、餓漢式--靜態**塊(推薦)

public class mysingleton2 

private mysingleton2()

public static mysingleton2 getinstance()

}

與上一種方式相似,前者利用靜態變數,後者利用靜態**塊,都是利用jvm的類載入機制,保證只會被例項化一次。

三、懶漢式(不推薦)

public class mysingleton3 

public static mysingleton3 getinstance()

return instance;

}}

四、懶漢式--同步方法

public class mysingleton4 

public static synchronized mysingleton4 getinstance()

return instance;

}}

五、雙重檢查(推薦)

public class mysingleton5 

public static mysingleton5 getinstance() }}

return instance;

}}

與上一種方式相比,同步鎖的粒度變小了,大大提高了效率,而且雙重檢查機制,保證了只會例項化一次

六、內部靜態類(推薦)

public class mysingleton6 

private static class mysingleton6instance

public static mysingleton6 getinstance()

}

這種實現方式和餓漢式相似,都是利用jvm類載入機制來保證只被例項化一次。與餓漢式不同的是,餓漢式在類載入時完成了例項化,而此種方式下,只會在第一次用到getinstance()方法,才會被例項化。

七、列舉(推薦)

public enum  mysingleton7
列舉很簡單,上面的red、black都是單例的,jvm中只會存在乙個例項。

單例測試:

public class mysingletonmain 

}

單執行緒環境下,上述所有輸出都是true。如果是多執行緒環境的話,上述提到的執行緒不安全的實現方式,輸出的結果可能會出現false,讀者可以自己去實驗。就我個人而言,我在實際開發中,一般會採用靜態內部類和列舉這兩種方式~~~

設計模式之單例模式(及七種寫法)

乙個類有且僅有乙個例項,並且自行例項化向整個系統提供 看看下面七種實現方式 public class singleton public static singleton getinstance public class singleton public static singleton getins...

JAVA 單例Singleton的七種模式

private static singleton1 instance private singleton1 public static singleton1 getinstance return instance private static singleton2 instance private ...

單例模式實現(七種)

單例模式確保乙個類只有乙個例項,並提供乙個全域性訪問點,實現單例模式的方法是私有化建構函式,通過getinstance 方法例項化物件,並返回這個例項 保證在jvm中只有乙個例項 優點 1 單例類只有乙個例項 2 共享資源,全域性使用 3 節省建立時間,提高效能 public class singl...