前言
程序设计离不开单例,好记性不如烂笔头,在此记录三种单例的推荐实现方式,直接上手使用。不做单例相关发展的解析。
单例模式定义
确保某一个类只有一个实例,并且自行实例化,向整个系统提供这个唯一实例。
1、DCL式(Double Check Lock)
public class SingletionDLC {
private volatile static SingletionDLC instance;
private SingletionDLC() {}
public static SingletionDLC getInstance() {
if (instance == null) {
synchronized (SingletionDLC.class) {
if (instance == null) {
instance = new SingletionDLC();
}
}
}
return instance;
}
}
优点介绍:
1、构造函数用private修饰,外部无法访问。 2、使用的时候即调用 getInstance 的时候才初始化。 3、static关键字修饰,静态变量,存储在内存中,只有一份数据。 4、synchronized线程安全,多线程情况下单例的唯一性。 5、两次判断空,避免多次同步(synchronized)。 6、使用 volatile 保证整个方法的执行顺序是按照我们缩写的执行。
2、静态内部类方式
public class SingletionInternalClass {
private SingletionInternalClass() {}
public static SingletionInternalClass getInstance() {
return SingletionInternalClassHolder.instance;
}
private static class SingletionInternalClassHolder {
private static final SingletionInternalClass instance = new SingletionInternalClass();
}
}
优点介绍:
1、构造函数用private修饰,外部无法访问。 2、使用的时候即调用getInstance的时候才初始化。 3、调用getInstance才回去加载SingletionInternalClassHolder类,确保了线程安全,保证了单例的唯一性。
3、枚举单例
public enum SingletionEmum {
INSTANCE;
public void doSomthing() {
}
}
优点介绍:
枚举在 java 中和普通的类一样,可以有字段和自己的方法。枚举实例的创建时线程安全并且任何情况下它都是一个单例。包括反序列化的时候。