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;
    }*/
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值