- 某个类只能有一个实例
- 必须自行创建实例
- 必须向整体系统对外提供这个唯一的实例
- 私有化构造方法
- 含有此类的静态私有对象
- 提供一个静态公有方法用于创建 获取静态私有对象
public class Singleton{
private Singleton(){}
private static SingletonOne INSTANCE = new Singleton();、
public static Singleton getInstance(){
return INSTANCE;
}
}
- 懒汉式(调用的时候才实例化 时间换空间 存在线程风险)
public class Singleton{
private Singleton(){}
private static Singleton INSTANCE = null;
public static Singleton getInstance(){
if(INSTANCE == null){
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
- 静态内部类实现线程安全的懒汉模式
- 外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。即当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类,这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
public class Singleton{
private Singleton(){}
private static class SingletonHolder{
private static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
- 双重校验锁实现线程安全的懒汉模式
- 对Instance使用volatile修饰即可,可以禁止指令重排序
- 双重判断 防止重复拿锁
public class Singleton{
private Singleton(){}
private static volatile Singleton INSTANCE = null;
private static Singleton getInstance(){
if(INSTANCE == null){
synchronized(Singleton.class){
if(INSTANCE == null){
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}