Double Check Lock
上述代码,能保证单例方式的线程安全性吗?
答案是肯定的。它既能实现单例模式,又能保证单例化的线程安全性。
那它有什么问题呢?
hf = new HumanFactory2(),它到底是先将引用hf指向堆内存空间(新对象分配的空间),还是先实例化对象完成呢(堆内存数据装填)?不确定(jvm乱序执行)
问题那就是,在线程1synchronized代码块还没完全执行完毕时,线程2的第一次判断,hf已经为非空,返回给了调用者。
那么就有可能在使用hf时,就会出现异常!
那么如何解决呢?volatile关键字,使用主内存中的hf
测试代码,待续...
网友评论