java单例双重锁校验

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;
    }*/
}
发布了434 篇原创文章 · 获赞 58 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/ppwwp/article/details/103043775