【设计模式】5. 单例模式(以及多线程、无序写入、volatile对单例的影响)

本文详细介绍了Java中的单例模式,包括其定义、优点、缺点、使用场景以及为什么不用全局变量实现。重点讨论了在多线程环境下的单例实现,如双重检查加锁、volatile关键字的作用以及其防止无序写入的重要性。同时提到了通过枚举实现单例的高效且安全的方法。
摘要由CSDN通过智能技术生成

单例模式

http://www.ibm.com/developerworks/cn/java/j-dcl.html

定义:

        Ensure a class has only one instance, and provide a global point of access to it.

        确保某个类只有一个实例,并提供一个全局访问点。

类图:

public class Singleton{
    private static final Singleton instance;
    private Singleton(){
    }
    public static Singleton getInstance(){    
        if(instance == null){          //1
            instance = new Singleton();//2
        }
        return instance;               //3
   }
    ...
}

优点:

  1. 内存中只有一个对象,减少内存开支;
  2. 单例可避免对资源的多重占用,例如写文件动作,可避免对同一资源文件的同时写操作。

缺点:

  1. 单例模式一般没有接口,扩展很困难; ——单例并不是用来继承的。
  2. 不利于测试,并行开发时,若单例未完成,则不能进行测试;
  3. 与单一职责原则冲突,把“要单例”和业务逻辑融合在一个类中。

使用场景:

若出现多个对象就会出现“不良反应”,应该用单例,具体场景如下:

  1. 要求生成唯一序列号的环境;
  2. 在整个项目中需要一个共享访问点或共享数据。例如页面计数器;
  3. 创建一个对象需要消耗的资源过多时;
  4. 需要定义大量的静态常量和静态方法的环境。


为什么不直接用全局变量来实现单例?

有缺点:全局变量必须在程序一开始就创建好。而单例模式可以延迟初始化。


类加载器对单例的影响:

不同的类加载器可能会加载同一个类。

如果程序有多个类加载器,可在单例中指定某个加载器,并指定同一个加载器。


多线程的影响:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值