单例模式
规则:一个类只有一个实例
方法:
不能被外部创建
限制外部访问方式
内部保证实例唯一
懒汉模式
第一次调用的时候实例化,使用静态属性,存储单例
设置私有构造器来限制外部访问
使用静态方法获取单例
public class Singleton {
/**
* 懒汉模式
*/
//静态属性,存储单例
private static Singleton lazy=null;
//设置私有构造器,限制外部无法通过构造器创建实例
private Singleton() {}
//静态方法获取单例
public static Singleton getLazy() {
if(lazy==null) {
lazy=new Singleton();
}
return lazy;
}
}
饿汉式
初始化时自行实例化
静态方法返回
public class SingleHurry {
private static SingleHurry sh=new SingleHurry();
private SingleHurry() {}
public static SingleHurry getSh() {
return sh;
}
}
双重检查锁 DCL
两次检查作用不同
第一次检查是否为空,不为空不创建
第二次检查保证单例
public class SingleDoubleChecking {
private static SingleDoubleChecking sdc;
private SingleDoubleChecking() {}
private static SingleDoubleChecking getSdc() {
//检查是否为空,不为空时不创建,节省性能消耗;为空时可能有并发问题
if(sdc==null) {
//同步代码块,保证不会被并发获取
synchronized(SingleDoubleChecking.class) {
//保证单例,再次判断,若不为空不建立实例
if(sdc==null) {
sdc=new SingleDoubleChecking();
}
}
}
return sdc;
}
}
枚举法
避免多线程同步问题
防止反序列化重新创建新的对象
使用enum
public enum SingleSe {
//唯一实例,默认public static final的
INSTANCE;
public String name;
public void doSomething() {
System.out.println("doSomething");
}
public static void main(String[] args) {
SingleSe.INSTANCE.doSomething();
}
}