Java设计模式之单例模式

栏目: 后端 · 发布时间: 5年前

内容简介:大部分时候我们是用不到同步的,所以,不建议用这种模式。第一次加载

在一个系统中,要求一个类有且仅有一个对象,具体使用场景如下:

  • 整个项目需要一个共享访问点或共享数据。
  • 创建一个对象需要耗费的资源过多,比如访问 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设计模式之单例模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

轻松学算法

轻松学算法

赵烨 / 电子工业出版社 / 2016-7 / 69.00元

《轻松学算法——互联网算法面试宝典》共分为12 个章节,首先介绍了一些基础的数据结构,以及常用的排序算法和查找算法;其次介绍了两个稍微复杂一些的数据结构——树和图,还介绍了每种数据结构和算法的适用场景,之后是一些在工作与面试中的实际应用,以字符串、数组、查找等为例介绍了一些常见的互联网面试题及分析思路,便于读者了解这些思路,顺利地通过互联网公司的面试;最后介绍了一些常见的算法思想,便于读者对今后遇......一起来看看 《轻松学算法》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具