内容简介:大部分时候我们是用不到同步的,所以,不建议用这种模式。第一次加载
在一个系统中,要求一个类有且仅有一个对象,具体使用场景如下:
- 整个项目需要一个共享访问点或共享数据。
- 创建一个对象需要耗费的资源过多,比如访问 I/O或者数据库等资源。
- 工具类对象。
单例模式的6六种写法
1. 饿汉模式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance(){ return instance; } } 复制代码
优点:
- 这种方式在类加载时就完成初始化了,获取对象但速度快。
- 避免多线程但同步问题。
缺点:
- 类加载较慢。
- 没有达到懒加载的效果,如果从始至终都未使用果这个实例,这会造成内存的浪费。
2. 懒汉模式(线程不安全)
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } 复制代码
优点:
- 节省资源
缺点:
- 第一次实例化对象时较慢。
- 多线程时不能正常工作。
3. 懒汉模式(线程安全)
public class Singleton { private static Singleton instance; private Singleton() { } public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } 复制代码
优点:
- 多线程中很好的工作。
缺点:
-
每次调用
getInstance
方法时都需要同步,这会造成不必要的同步开销。
大部分时候我们是用不到同步的,所以,不建议用这种模式。
4. 双重检查模式
public class Singleton { private volatile static Singleton instance; private Singleton() { } public static Singleton getInstance(){ if(instance == null){ synchronized (Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } } 复制代码
优点:
- 资源利用率高。
- 避免多余同步。
- 线程安全。
缺点:
volatile
DCL
(Double Check Lock) 在高并发环境下也会有一定的缺陷, DCL
虽然在一定程度上解决了资源的消耗、多余的同步、线程安全问题等问题,但还是在某些情况会出现失效的问题,也就是 DCL
失效。这里建议用静态内部类单例模式来代替 DCL
。
5. 静态内部类单例模式 (推荐使用)
public class Singleton { private Singleton() { } public static Singleton getInstance(){ return SingletonHolder.sInstance; } private static class SingletonHolder { private static final Singleton sInstance = new Singleton(); } } 复制代码
第一次加载 Singleton
类时并不会初始化 sInstance
。 只有在第一次调用 getInstance
方法时虚拟机才会加载 SingletonHolder
并初始化 sInstance。
优点:
- 资源利用率高。
- 避免多余同步。
- 线程安全。
缺点:
- 暂无
6. 枚举单例
public enum Singleton { INSTANCE; public void doSomeThing() { } } 复制代码
优点:
- 任何情况下都是单例。
- 默认线程安全。
缺点:
- 简单
- 可读性不高。
总结:到这里6种单例写法已介绍完,至于选择那种形势的单例模式,取决与你项目本身情况:是否复杂的高并发环境,或者是否需要控制单例对象的资源消耗。
以上所述就是小编给大家介绍的《Java设计模式之单例模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。