az467

az467

一灯孤燃
V2EX 第 249184 号会员,加入于 2017-08-17 12:41:11 +08:00
不热爱编程 不喜欢生活
对代码没有追求 憎恨互联网和软件行业
对技术充满冷漠 没有较强的责任心和抗压能力
对新生事物平淡 不乐于探索
不熟悉编程语言 没有扎实的计算机基础
对数据结构、算法基础均无深入理解
不能有效掌握TCP/IP协议栈细节 对现有框架和解决方案没有自己的理解
没有有ACM等竞赛经验 没有互联网大厂实习经历

负面驱动 苦大仇深
根据 az467 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
az467 最近回复了
注意转氨酶
你自己都 3 天摸成两周,
其他人真的就在 996 嘛?
54 天前
回复了 cool4food 创建的主题 职场话题 想问一下大家觉得体制内工作好在那里
体制内和体制内也是不一样的
去之前打听清楚
兄弟进厂啊
工资都一样
211 每月补助 200 985 每月 300 硕士每月 500
刷题魔怔了属于是
@mdkml
1. 可以 不是 必须。
2. println() 内部锁住了 System.out ,而且是在循环体内部调用,这给 Hotspot 的优化方式造成了影响,所以在这里程序可以终止。
但是换成另外一种 jvm / 平台就又不一定了。
@FrankHB

啊?

Chapter 13 的例子中程序有加锁,并且没有 external action,所以用 fairness 解释为什么程序可能会被优化成死循环。

原 po 的代码里甚至都没有出现过 synchronized/volatile,任何 happens before 关系都没有,
就算 Java 保证调度公平,难道 JIT 编译器就不优化了?
@ignor 你可以这么理解,“时间上的延迟”在这里是无穷大。
@ignor

了解一下 JMM,你就会知道这种优化非但没有错误,反而完全是正确的。

因为变量没有被 volatile 修饰,所以 jvm 不用保证变量在线程间的可见性。
既然不用保证,那当然可以完全不保证,甚至可以反过来“保证”变量完全不可见。

这就像很多人开了 gcc 的 O3 优化,然后惊奇地发现程序运行结果跟自己预期不一致。
不好意思,是你把代码写错了。
月经问题。。。

不是编译器优化,是 jvm 优化。

你没把 jvm 的 jit 关掉,所以 jvm 把

while (!ready);

优化成了

if (ready == false)
while (true);
关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2123 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 9ms · UTC 04:35 · PVG 12:35 · LAX 21:35 · JFK 00:35
♥ Do have faith in what you're doing.