面试官问dcl为什么用volatile 我回答是为了禁止指令重排序,防止返回没有完成初始化的singleton对象 他一直说不对 还一直问我 我真的难受啊
全部评论
volatile关键字不就两个作用吗,这个不对你换保证可见性,他还说不对,你就说你TM给我解释解释,什么TMD叫dcl要用volatile
8 回复 分享
发布于 2022-05-06 18:52
个人理解,你的回答是对的。先跑A线程,因为new 对象的过程不是原子的,那就可能分配了内存但没有初始化,此时跑B线程,check时因为对象分配了内存不会为null,直接返回了一个没有初始化完成的对象,然后A线程再初始完对象……所以根源在于 new 操作非原子,存在被指令重排的可能性,对象虽然只会被 new 一次而且可以成功初始化,但在 new 的过程中,其他线程可能会拿到未被初始化完成的对象。
2 回复 分享
发布于 2022-05-08 10:41
保证可见性,多线程情况下,初始化立即能被看见。
1 回复 分享
发布于 2022-05-02 11:22
这里解释一下,volatile 的作用确实不是禁止指令重排序(虽然网上大都是这么笼统的说的) 之所以多线程会获取到未完全初始化完成的单例对象,是因为new关键字在字节码中是分三步来执行的,正是这三步的乱序造成了线程不安全的问题。volatile真正的作用是在这三步字节码前后加上内存屏障(而不是禁止重排),从而防止对象在未初始化完成就被获取
14 回复 分享
发布于 2022-05-08 09:21
感觉严格来说并不是禁止指令的重排序,而是加入了读写屏障使得指令的重排序收到了一定的限制从而避免了singleton对象在创建后但是并未初始化完毕的情况下返回,只能说受限而非禁止,我认为。
点赞 回复 分享
发布于 2023-11-02 20:51 浙江
我觉得你的回答没有问题,我查了一下viotile的oracle官方文档,里面明确了是可以禁止重排序的,如果不禁止重排序,需要保证重排序的所有结果和不重排序是一样的。 官网viotile地址:https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.3.1.4 关于new关键字的问题:我使用idea自带的show bytecode工具查看字节码,结果如下: 后面的注释是我自己加上的 L9 // 第九个子程序 LINENUMBER 15 L9 // 第九个子程序对应代码第15行, 这行中只有new 的一句话 NEW org/short_address/org/keyword/VolatileTest // 生产对象 DUP INVOKESPECIAL org/short_address/org/keyword/VolatileTest.<init> ()V // 初始化 PUTSTATIC org/short_address/org/keyword/VolatileTest.object : Lorg/short_address/org/keyword/VolatileTest; // 把new的对象引用赋值给object对象 综上所述,我觉得楼主回答的没有问题
点赞 回复 分享
发布于 2022-06-28 11:12
确实是错的,应该是happens before规则
点赞 回复 分享
发布于 2022-06-13 15:39

相关推荐

06-20 16:31
门头沟学院 Java
base南京&nbsp;&nbsp;Java后端实习(这个公司真的好,但是感觉是悬了。拷打了50分钟,面试官最后原本想说周一,也就是下一个工作日,结果后面说一周。可能是要排序,也可能已经婉拒了呜呜呜)一面:自我介绍讲一下你的第一个项目吧,用到了什么中间件?讲一下你对微服务的了解nacos它服务拉取,会拉哪些参数?nacos怎么保证一个服务没有宕机?心跳机制的服务移除,是马上移除吗?二阶段提交讲一下seata的全局事务注解是什么?如果有一个用户,消息接收失败了,应该怎么办?你做项目遇到了哪些难点?怎么解决的?有状态和无状态讲一下你用的什么数据库?索引分类有哪些?你为什么要用threadlocal?我创建了一个异步的线程,那threadlocal里的数据怎么办?分布式锁和CAS你是怎么用的?你的redis挂掉了怎么办?全挂掉了怎么办?为什么要设置缓存空值?为什么要设置随机过期时间?你的分布式锁的key是怎么设置的?超选可以给出业务层面的解决办法吗?你讲一下订单超时的回滚怎么做的死信队列是什么?聊点java基础吧Spring的bean是怎么注入的?AOP了解过吗?hashmap和ConcurrentHashMap有什么区别?map的key可以设置为空值吗?AQS有了解吗?里面有哪些锁?讲一下重入锁吧线程池了解过吗?有哪些参数?我有三个异步的线程,怎么把他们同步在一条水平线上?讲一下CAS的思想反问:您对我今天面试的表现感觉怎么样?(挺好的,可以)您可以给我一些建议吗?(多做一些项目)我需要去深入研究ai吗?我可以了解一下公司的业务吗?(电力能源,和电网合作)如果我有幸入职,我会接触到什么业务呢?(写一些简单的业务,学习我们的项目)我的面试结果会在什么时候通知我呢?(今天周五,应该是下周(一)……一周)
黎寻汐:能进清能,我给牛油们包大红包
点赞 评论 收藏
分享
评论
3
21
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务