单例模式整理

 单例模式的使用场景:

  1. 配置文件的读取如日志文件,应用配置该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息
  2. 控制资源的情况下,方便资源之间的互相通信。如线程池等数据库连接操作增删改,如果非单例,就会有很多的对象实例创建。
  3. 如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例, 这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。

懒汉式:有锁才安全,但是效率低

public class Singleton {  

    private static Singleton instance;  

    private Singleton (){}  

  //线程不安全,用public static synchronized Singleton getInstance()

  //的方式可以保证线程安全,但是效率低

    public static Singleton getInstance() {  

    if (instance == null) {  

        instance = new Singleton();  

    }  

    return instance;  

    }  

}  

饿汉式:执行效率高,但是初始化就分配内存,浪费内存

   public class Singleton {  

    private static Singleton instance = new Singleton();  

    private Singleton (){}  

    public static Singleton getInstance() {  

    return instance;  

    }  

}  

双检锁/双重校验锁(DCL,即 double-checked locking

这种方式采用双锁机制,安全且在多线程情况下能保持高性能

public class Singleton {  

    private volatile static Singleton singleton;  

    private Singleton (){}  

    public static Singleton getSingleton() {  

    if (singleton == null) {  

        synchronized (Singleton.class) {  

        if (singleton == null) {  

            singleton = new Singleton();  

        }  

        }  

    }  

    return singleton;  

    }  

}  

静态内部类

 

public class Singleton {  

    private static class SingletonHolder {  

    private static final Singleton INSTANCE = new Singleton();  

    }  

    private Singleton (){}  

    public static final Singleton getInstance() {  

    return SingletonHolder.INSTANCE;  

    }  

}   

猜你喜欢

转载自www.cnblogs.com/520beibei/p/9288260.html