温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java怎么实现双重校验锁单例

发布时间:2022-01-21 17:09:26 来源:亿速云 阅读:152 作者:iii 栏目:开发技术

这篇文章主要介绍了Java怎么实现双重校验锁单例的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么实现双重校验锁单例文章都会有所收获,下面我们一起来看看吧。

    代码实现

    Java代码实现如下:

    //双重校验锁单例
    public class SingleInstance {
        //必须volatile修饰 见分析1
        private volatile static SingleInstance instance;
        //私有化构造函数
        private SingleInstance() {
        }
     
        public static SingleInstance getInstance() {
            //第一个判空 见分析2
            if (instance == null) {
                synchronized (SingleInstance.class) {
                    //第二个判空 见分析3
                    if (instance == null) {
                        //新建实例
                        instance = new SingleInstance();
                    }
                }
            }
            return instance;
        }
    }

    首先这里synchronized关键字没有修饰整个getInstance函数,因为这个函数可能使用地方很多,这样就会造成其他线程阻塞,不太好,所以这里只同步了一段代码。

    分析2:为什么在进入同步代码块时需要进行进行判空,假如有线程A和线程B,这时线程A先判断instance为null,所以它进入了同步代码块,创建了对象,然后线程B再进来时,它就不必再进入同步代码快了,可以直接返回,也其实也就是懒加载,可以加快执行速度。

    分析3:为什么在同步代码块中还要再进行一次判断呢,假如有线程A和线程B,它俩A先调用方法,B紧接着调用,这时A、B在分析2出的判空都是空,所以A进入同步代码块,B进行等待,当A进入同步代码块中创建了对象后,A线程释放了锁,这时B再进入,如果这时不加分析3的判空,B又会创建一个实例,这明显不符合规矩。

    分析1:那既然加了2层判断,那为什么还要加个volatile关键字呢,这里知识点就有点多了。

    因为新建实例的代码:

    instance = new SingleInstance();

    它不是一个原子操作,这个简单的赋值可以分为3步:

    1、给SingleInstance分配内存

    2、调用SingleInstance的构造方法

    3、把instance指向分配的内存空间

    这是正常逻辑的3个步骤,也只有按1 2 3执行后,这个instance才不是null。

    但是Java内存模型允许这个进行指令重排序,也就是这3步可能是123也可能是132,所以这里就有问题了。

    假如线程A和线程B,线程A已经跑到分析3处的代码,这时这条指令执行是132,刚把步骤3执行完,这时线程B跑到了分析1处的代码,会发现instance不为null了,这时线程B就直接返回了,从而导致错误。

    既然知道了原因,那volatile关键字就是解决这个的,它可以禁止指令重新排序,而且保证所有线程看到这个变量是一致的,也就是不会从缓存中读取(这个特性后面有机会再说),所以在创建instance实例时,它的步骤都是123,就不会出错了。

    关于“Java怎么实现双重校验锁单例”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java怎么实现双重校验锁单例”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI