volatile在DCL中的应用

来源:4-2 如何写出线程安全的程序?

慕雪3000668

2019-03-28

图片描述

老师,这种情况,如果构造方法里面没有其他操作,是不是不加volatile也可以呢?不会涉及到重排序的问题

写回答

1回答

bennyhuo

2019-03-28

构造方法里面就算你什么都没写,但也是有构造的,如果不加volatile,一样会导致开两块内存构造两次对象,就不是单例啦。

另外,如果你的类有很多成员,即便你不在构造里面写任何代码,这些成员的初始化操作也会做为构造的一部分的~

1
5
bennyhuo
回复
慕雪3000668
这里有个误区,synchronized可以保证有序性,但你要保证所有访问者都加锁。这里出问题的情况,恰恰是前面线程初始化了一半儿,后面线程没加锁就去判断是否为空,所以synchronized是不会起作用的。
2019-03-29
共5条回复

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1636 学习 · 222 问题

查看课程