package conllections;
public class SingleInstance {
//懒加载:虽然可以延迟加载实例,但多线程下存在安全问题,判空之后切换线程,可能加载多个实例
// private static SingleInstance singleInstance;
// private SingleInstance(){}
// public static SingleInstance getSingleInstance(){
// if(singleInstance == null){
// singleInstance = new SingleInstance();
// }
// return singleInstance;
// }
//懒加载的双重检查锁方式:
//volatile避免了指令重排序,保持共享变量可见性,即在当前线程写入,其他线程可见,写 happen-before 读
private volatile static SingleInstance singleInstance;
private SingleInstance(){}
public static SingleInstance getSingleInstance(){
//第一次判空,确保只有第一次获取时加锁
if(singleInstance == null){
//锁对象不锁方法,减小锁范围
synchronized (SingleInstance.class){
//第二次判空,避免其他获取锁失败阻塞的线程在被唤醒时再次初始化
if(singleInstance == null){
singleInstance = new SingleInstance();
}
}
}
return singleInstance;
}
/* //饿加载:JVM在类加载的时候线程安全完成静态成员变量实例的初始化,但是存在浪费内存的问题
private static SingleInstance singleInstance = new SingleInstance();
private SingleInstance(){}
public static SingleInstance getSingleInstance(){
return singleInstance;
}*/
/**/
//静态内部类:延迟加载,线程安全,代码简洁,缺点是无法接受传参
/* private static class SingleInstanceHolder{
private static SingleInstance singleInstance = new SingleInstance();
}
private SingleInstance(){}
public static SingleInstance getInstance(){
return SingleInstanceHolder.singleInstance;
}*/
}
java单例双重锁校验
最新推荐文章于 2022-12-03 19:17:27 发布