java指令重排序问题

GUOXIAOHU1 2017-06-28 10:44:52
对于instance = new Someobject(),并不是一个原子操作,这个过程分成了3步:
1,给 instance 分配内存
2,调用 Someobject的构造函数来初始化成员变量
3,将instance对象指向分配的内存空间

在JVM的即时编译器中,存在指令重排序。在上面的例子中,2操作依赖1操作,但3操作并不依赖2操作,也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是1-2-3 也可能是1-3-2。那么不就会导致在普通情况下得到的instance 就可能是一个没有初始化的对象引用?

不涉及多线程,就是单线程的最普通的instance = new Someobject()语句,会产生这种问题吗?还是我理解错了?真心求解
...全文
11018 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
生财 2020-12-17
  • 打赏
  • 举报
回复
把这东西放到一个方法体里,并且在一个线程中,原子不原子无所胃了吧,原子一般用来记数或者使用信号量来管理避免冲突.
qq_39936465 2020-12-16
  • 打赏
  • 举报
回复
引用 楼主 GUOXIAOHU1 的回复:
对于instance = new Someobject(),并不是一个原子操作,这个过程分成了3步: 1,给 instance 分配内存 2,调用 Someobject的构造函数来初始化成员变量 3,将instance对象指向分配的内存空间 在JVM的即时编译器中,存在指令重排序。在上面的例子中,2操作依赖1操作,但3操作并不依赖2操作,也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是1-2-3 也可能是1-3-2。那么不就会导致在普通情况下得到的instance 就可能是一个没有初始化的对象引用? 不涉及多线程,就是单线程的最普通的instance = new Someobject()语句,会产生这种问题吗?还是我理解错了?真心求解
单线程都是顺序执行的,是不是原子操作意义不大。
彩我一生 2020-12-16
  • 打赏
  • 举报
回复
1.单线程的情况下不会存在这中问题, 2.有个大厂的面试题是这样问的,单例模式知道吗(如果说不知道,估计要出门右转),用不用加volatile修饰, 3.你的理解回答这个问题是没问题的,由于指令重排造成的问题只有在并发量非常高的时候才有可能遇到,像双十一的时候估计会遇到
qq_33641175 2020-12-12
  • 打赏
  • 举报
回复
可以用asmtools(要求jdk1.8)反编译class试试 我认为过程是 1. 分配了创建Someobject所需的内存(引用暂存在栈顶) 2. 调用构造函数初始化内存 3. 将引用给到instance
小码农_QS 2020-12-11
  • 打赏
  • 举报
回复
引用 4 楼 HinanaiTenshi 的回复:
单线程的场景下,并没有原子操作这一说.....
事务操作不算是原子操作吗
HinanaiTenshi 2017-07-05
  • 打赏
  • 举报
回复
单线程的场景下,并没有原子操作这一说.....
lyn584238910 2017-06-28
  • 打赏
  • 举报
回复
List<> list = null; list = new arraylist<>();你可以先创建一个对象给它空值,然后你在哪用在哪里new
nikyotensai 2017-06-28
  • 打赏
  • 举报
回复
没问题
soton_dolphin 2017-06-28
  • 打赏
  • 举报
回复
对单线程没有影响,不会有任何问题

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧