JAVA volatile关键字的疑问

synchronized 关键字可以保证可见性吗?

请问synchronized可以保证可见性吗,可是在双重检查加锁的时候为什么还要用volatile 关键字保证变量的可见性?

#21天打卡剑指offer##Java#
全部评论
就是因为这个双重校验锁我和字节的三面面试官怼了10分钟,我从指令重排去解释,他非说不需要volatile关键字
2 回复 分享
发布于 2020-04-19 21:52
自己看源码
点赞 回复 分享
发布于 2020-04-19 20:47
变量的赋值操作依然可以被编译器优化,此时就有可能会发生指令重排序,加volatile就为了防止指令重排序(不知道说的对不对)(狗头保命)🤣🤣
点赞 回复 分享
发布于 2020-04-19 20:57
https://blog.csdn.net/qq_33589510/article/details/105319129 看我的博客解释
点赞 回复 分享
发布于 2020-04-19 22:59
创建对象时候会导致其他线程访问到空对象,所以要加volatile加内存屏障
点赞 回复 分享
发布于 2020-04-21 08:05
凡事都加锁,未免有点太重量级了
点赞 回复 分享
发布于 2020-04-21 08:51
看周志明那本JVM,关于dcl的有解释
点赞 回复 分享
发布于 2020-04-23 00:27
知识点 happen-before可见性和volatile的防止重排序,两个对同一个对象的锁内写,对下一次该对象的锁内读是可见的,这是HB规则的一条。DCL初始化以后都是非锁读的,但是由于可能的指令重排序,这就有个问题,初始化可能没完成就被读到了,volatile的目的是防止这种情况
点赞 回复 分享
发布于 2020-05-13 18:14

相关推荐

评论
1
4
分享
牛客网
牛客企业服务