除未经优化的懒汉式存在多线程环境下的线程安全问题,其它都可以在多线程环境下正常运行
静态内部类利用了java语言自带特性,未必适用于其它语言环境
单例模式构造函数为私有 故单例模式类不可被继承
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(){} //私有 构造函数
synchronized public static Singleton getInstance(){ //静态公有 加同步锁 工厂方法
if (instance == null)
instance = new Singleton();
return instance;
}
}
4 . 双重检查(double check)的懒汉式
public class Singleton {
//volatile关键字的两层语义:
//保证了不同线程对这个变量进行操作时的可见性
//禁止进行指令重排序
private volatile static Singleton instance; //静态私有volatile 成员变量
private Singleton(){} //私有 构造函数
public static Singleton getInstance(){ //静态公有 工厂方法
if (instance == null){
synchronized (Singleton.class){ //对单独一句话加锁等于没加
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
5 . 静态内部类(java语言环境下最好的实现方式)
public class Singleton {
private Singleton(){} //私有 构造函数
private static class SingletonBuilder{ //静态内部类
private static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonBuilder.instance;
}
}