设计模式之单例模式实践
生活随笔
收集整理的這篇文章主要介紹了
设计模式之单例模式实践
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概念
單例模式即一個JVM內存中只存在一個類的對象實例
?
分類
1、懶漢式
類加載的時候就創建實例
2、餓漢式
使用的時候才創建實例
?
當然還有其他的生成單例的方式,雙重校驗鎖,枚舉和靜態內部類,文中會有介紹
?
實踐
懶漢式
1)線程不安全,不可用
public class Singleton { ?private static Singleton instance; ?private Singleton (){} ?public static Singleton getInstance() { ?if (instance == null) { ?instance = new Singleton(); ?} ?return instance; ?} ?}?2)線程安全,同步方法,效率低,不推薦
public class Singleton { ?private static Singleton instance; ?private Singleton (){} ?public static synchronized Singleton getInstance() { ?if (instance == null) { ?instance = new Singleton(); ?} ?return instance; ?} ?}?3)線程不安全,會產生多個實例,不可用
public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {singleton = new Singleton();}}return singleton;} }4)?餓漢式,無線程安全問題,不能延遲加載,影響系統性能
public class Singleton { ?private static Singleton instance = new Singleton(); ?private Singleton (){} ?public static Singleton getInstance() { ?return instance; ?} ?}?5)
public class Singleton { ?private static Singleton instance = null; ?static { ?instance = new Singleton(); ?} ?private Singleton (){} ?public static Singleton getInstance() { ?return instance; ?} ?}6)雙重校驗鎖,線程安全,推薦使用
public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}}?7)靜態內部類,線程安全,主動調用時才實例化,延遲加載效率高,推薦使用
public class Singleton { ?private static class SingletonHolder { ?private static final Singleton INSTANCE = new Singleton(); ?} ?private Singleton (){} ?public static final Singleton getInstance() { ?return SingletonHolder.INSTANCE; ?} ?}?8)枚舉類型,無線程安全問題,避免反序列華創建新的實例,很少使用
public enum Singleton { ?INSTANCE; ?public void whateverMethod() { ?} ?}注意事項
1、考慮多線程問題
2、單例類構造方法要設置為private類型禁止外界new創建
private Singleton() {}
3、如果類可序列化,考慮反序列化生成多個實例問題,解決方案如下
private Object readResolve() throws ObjectStreamException { ?// instead of the object we're on, return the class variable INSTANCE ?return INSTANCE; ?} ??
使用場景
1、工具類對象
2、系統中只能存在一個實例的類
3、創建頻繁或又耗時耗資源且又經常用到的對象
?
下面是單例模式在JDK的應用
另外,spring容器中的實例默認是單例餓漢式類型的,即容器啟動時就實例化bean到容器中,當然也可以設置懶漢式defalut-lazy-init="true"為延遲實例化,用到時再實例化。
總結
以上是生活随笔為你收集整理的设计模式之单例模式实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入浅出 Java 中 JVM 内存管理
- 下一篇: 设计模式之动态代理模式实战