美文网首页
单例模式的六种创建方式

单例模式的六种创建方式

作者: e小e | 来源:发表于2017-10-10 08:25 被阅读35次

在使用java编码的过程中经常会去写单例模式,今天总结一下6种常见单例写法.

饿汉模式

public class HungerSingleton {
    private static HungerSingleton singleton = new HungerSingleton();
    private HungerSingleton() {
    }
    public static HungerSingleton getHungerSingletonInstance(){
        return singleton;
    }
}

评价:这种模式直接在类初始化的时候实例化单例,线程安全,但是没有延迟加载。

懒汉模式

public class LazySingleton {
    private static LazySingleton singleton;
    private LazySingleton() {
    }
    public static LazySingleton getLazySingletonInstance(){
        if (singleton == null){
            singleton = new LazySingleton();
        }
        return singleton;
    }
}

评价:这种模式在需要使用该对象的时候时候实例化单例,做到了延迟加载,节约内存,但是非线程安全。

懒汉线程安全模式

public class LazyThreadSafeSingleton {
    private static LazyThreadSafeSingleton singleton;
    private LazyThreadSafeSingleton() {
    }
    public synchronized static LazyThreadSafeSingleton getLazyThreadSafeSingletonInstance(){
        if (singleton == null){
            singleton = new LazyThreadSafeSingleton();
        }
        return singleton;
    }
    //或者
public static LazyThreadSafeSingleton getLazyThreadSafeSingletonInstance(){
        synchronized (LazyThreadSafeSingleton.class){
            if (singleton == null){
                singleton = new LazyThreadSafeSingleton();
            }
            return singleton;
        }
    }
}

评价:同时做到了线程安全,而且延迟加载,但是每次getLazyThreadSafeSingletonInstance都会使用synchronized关键字影响了效率.

DCL模式模式

public class DclSingleton {
    private static volatile DclSingleton mInstance = null;
    public static DclSingleton getInstance() {
        if (mInstance == null){
            synchronized (DclSingleton.class){
                if (mInstance == null){
                    mInstance = new DclSingleton();
                }
            }
        }
        return mInstance;
    }
}

评价:这里我们进行了双重check,第一次check没有synchronized关键字,比懒汉线程安全节约了效率,第二次check的时候加入了synchronized关键字再一次进行了一次是否为null的判断,这样保证在多线程并且mInstance都为null情况下进行重复创建。注意mInstance = new DclSingleton()这句代码,它实际上并不是一个原子操作,这条代码最终会编译成多条汇编指令,它大概会做三件事

  1. 给DclSingleton分配内存
  2. 调用DclSingleton构造函数,初始化成员字段
  3. 将mInstance对象指向分配的内存控件(此时mInstance就不是null了)
    上面2,3顺序是不能保证顺序执行的,也就是说顺序可能是123也有可能是132,也就是说在3执行完毕,2未执行完的情况,会存在其它线程调用getInstance()直接返回mInstance的情况。所以我们必须加上volatile关键字,保证不会出现132这种情况

静态内部类模式

public class StaticInnerSingleton {
    
    private StaticInnerSingleton(){
    }

    public static StaticInnerSingleton getInstance(){
        return StaticInnerHolder.sInstance;
    }

    public static class StaticInnerHolder{
        public static final StaticInnerSingleton sInstance = new StaticInnerSingleton();
    }
}

评价:这种单例模式简单,线程安全,并且延迟加载,推荐使用

枚举模式

public enum EnumSingleton {
    INSTANCE;
    public void doSomeThing(){
        System.out.println("do sth");
    }
}

评价:这种单例模式简单,线程安全

总结:任何单例模式都是将构造函数私有化,对外提供统一获取唯一实例的接口,在选择哪种模式要考虑线程安全,延迟加载因素。

相关文章

  • 常见的设计模式

    创建型模式 结构型模式 行为模式 单例模式 单例模式的优点 常见的五种单例模式实现方式 单例带来的问题 如何选择 ...

  • Android 设计模式之单例设计模式

    简介 单例设计模式(Singleton Pattern),属于创建型模式,它提供了一种创建对象的方式.单例模式确保...

  • 设计模式与架构02 -- 单例模式,工厂模式

    单例模式 单例模式是最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式; 单例模式只涉及到一个单...

  • 单例模式

    本文章采用循序渐进的方式对单例模式进行演化实现。 什么是单例模式,为什么要使用单例模式? 单例模式就是只允许创建一...

  • [iOS Swift] Singleton——单例模式的使用与理

    单例模式属于创建型的设计模式。它提供了一种创建对象的最佳方式。 示例代码: 使用方式: 理解 Swift的单行单例...

  • Singleton 单例模式

    单例概念 单例模式属于创建者模式,该模式提供了一种最佳的创建对象方式,为何最佳?? 单例是指对某个类而言,该类负责...

  • 单例模式的六种创建方式

    在使用java编码的过程中经常会去写单例模式,今天总结一下6种常见单例写法. 饿汉模式 评价:这种模式直接在类初始...

  • 枚举单例——避免反序列化破坏单例

    六种单例模式实现 枚举单例 深度解析单例与序列化

  • 单例模式

    什么是单例模式? 一个类只允许创建一个实例,那个类就是单例类。这个模式就是单例模式。单例模式实现方式:饿汉式:实现...

  • 设计模式之创建型

    创建型指的是对象模型的创建。 有以下五种方式: 单例、原型、工厂、抽象工厂、建造者。 单例有懒汉模式和饿汉模式,区...

网友评论

      本文标题:单例模式的六种创建方式

      本文链接:https://www.haomeiwen.com/subject/eizpyxtx.html