V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  cmai  ›  全部回复第 6 页 / 共 7 页
回复总数  124
1  2  3  4  5  6  7  
2020-05-15 14:15:55 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@ChanKc 明白你的意思,这段代码确实没有命中 happens-before 的其中某项规则,所以编译器可以这样做,但是最终造成了代码出现问题
2020-05-15 14:02:10 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
链接好像混在一起了,不知道 v2 的回复怎么使用 markdown
https://stackoverflow.com/questions/25425130/loop-doesnt-see-value-changed-by-other-thread-without-a-print-statement
------------------------------------------------------------
https://www.zhihu.com/question/39458585/answer/81521474
2020-05-15 14:00:22 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@ChanKc 根据 @TuGai 的回复,RednaxelaFX 的回答​和 stackoverflow 的文章, 我认为是 javac 编译出的字节码是正确的执行逻辑, 而 JIT 编译器做了对那段循环代码做了优化处理,flag 变量被当作了循环不变量, 所以当用-Xint 参数,指定 jvm 以字节码执行时,结果是正确的,参考上面的两个链接,https://stackoverflow.com/questions/25425130/loop-doesnt-see-value-changed-by-other-thread-without-a-print-statement;https://www.zhihu.com/question/39458585/answer/81521474
2020-05-15 13:45:00 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@TuGai get 到了
2020-05-15 13:26:50 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
2.-Xint 转成机器码为什么可以,以及 a 线程修改了 flag 的值,main 线程的死循环里为何一直拿不到修改后的值,在上面的链接里可以看到相关答案, 代码可能被优化为了
if (a.isFlag() == false) while (true) {}
2020-05-15 13:23:26 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
1.println 为什么可以, 起初我以为是 sync 的原因, 之后发现可能是 jvm 的优化,https://stackoverflow.com/questions/25425130/loop-doesnt-see-value-changed-by-other-thread-without-a-print-statement,这里有一段关键的回答
> it cannot cache the variable during the loop if you call System.out.println
2020-05-15 13:02:02 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@TuGai 试过了,是可以的,还请老哥指教为什么编译成机器码执行就可以了
2020-05-15 10:01:17 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@yeqizhang 上面说了,其实那个问题 1 和 if 取反没关系,应该是 else 之后的 println 函数里用到了 sync
2020-05-14 22:28:14 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@Lonely 我会查阅相关资料并且实践,如果确实是这样,并且搞清楚他优化的原因,我回再回来终结此话题的
2020-05-14 22:27:14 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@momocraft 感谢回复,我认为搞懂 main 线程为何在死循环里始终读不到被 a 线程修改后的 flag 的值对我很有帮助,因为和我目前的认知产生了冲突,或者说是我的认知度太浅,所以想究其原因
2020-05-14 21:28:18 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@xzg 感谢,volatile/sync 是可以达到这样的效果,但是我的问题其实侧重于:主存和线程副本内存是怎么交互的,而不是如何才能达到线程通信的效果
2020-05-14 21:25:10 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@cmai fix: ok,感谢,这个我了解,但是其实我不是想问这个,因为 volatile 的话,所有线程对于该变量的操作,会加上内存屏障,从主存中获取, 但是如果我不加 volatile 的话, 我想问线程缓存的副本何时刷新到主存
2020-05-14 21:24:07 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@secondwtq 让各位见笑了
2020-05-14 21:22:46 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
并且其他用到该变量的线程何时从主存刷新到自己的线程副本
2020-05-14 21:21:57 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@zifangsky ok,感谢,这个我了解,但是其实我不是想问这个,因为 volatile 的话,线程对于改变量的操作,会加上内存屏障,从主存中获取, 但是如果我不加 volatile 的话, 我想问线程缓存的副本何时刷新到主存
2020-05-14 20:59:22 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@yeqizhang 我水平可能不太够,暂时还不能从这里下手
2020-05-14 20:58:41 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
2.在没有 else 的情况下,a 线程修改了 flag 的值,main 线程的死循环里为何一直拿不到修改后的值
现在只有这个问题了
2020-05-14 20:57:37 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
1. else 到底影响了主存和工作内存之间的哪些交互?
本问题已结案,println 中用到了 sync
@zhgg0
2020-05-14 20:56:54 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
@zhgg0 感谢,看到了 sync,瞬间懂了。。。,是我疏忽了
2020-05-14 20:45:41 +08:00
回复了 cmai 创建的主题 程序员 关于 jmm 内存模型的问题
期待答复
1  2  3  4  5  6  7  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2736 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 07:20 · PVG 15:20 · LAX 23:20 · JFK 02:20
Developed with CodeLauncher
♥ Do have faith in what you're doing.