Java 杂谈

Double Check Lock是存在问题的

2019-01-20  本文已影响2人  大黑跟小白的日常

Double Check Lock

上述代码,能保证单例方式的线程安全性吗?

答案是肯定的。它既能实现单例模式,又能保证单例化的线程安全性。

那它有什么问题呢?

hf = new HumanFactory2(),它到底是先将引用hf指向堆内存空间(新对象分配的空间),还是先实例化对象完成呢(堆内存数据装填)?不确定(jvm乱序执行)

问题那就是,在线程1synchronized代码块还没完全执行完毕时,线程2的第一次判断,hf已经为非空,返回给了调用者

那么就有可能在使用hf时,就会出现异常!

那么如何解决呢?volatile关键字,使用主内存中的hf

测试代码,待续...

上一篇 下一篇

猜你喜欢

热点阅读