关于LazySingleton防反射攻击的一个小疑问?

来源:8-7 单例设计模式-反射攻击解决方案及原理分析

LBruce

2019-02-25

private LazySingleton() {
        if (lazySingleton != null) {
            throw new RuntimeException("已经存在...");
        }
    }

2个线程,一个反射的线程,一个获取单例的线程。为什么反射线程先实例化对象的话,这个单例就不止一个对象了?打过断点,反射线程在先,获取单例线程在后的话,2次进入构造函数时if(lazySingleton != null)的判断都是false,为什么?谢谢解答。

写回答

1回答

geelylucky

2019-02-25

亲爱的同学,你好,我是geely老师的助教。

这个是因为两个线程没有做互斥,反射是直接调用构造函数,但是在构造函数里面可以多线程访问,所以会造成可以创建多个实例的情况。

0
1
LBruce
一语惊醒梦中人~谢谢~~
2019-02-25
共1条回复

Java设计模式精讲-Debug方式+内存分析

系统学习设计原则,设计模式,锤炼编码内功,赢取高薪Offer

3430 学习 · 407 问题

查看课程