我们是正经的技术内推交流群

2020-12-29 00:22:10 +08:00
 lewis89
迫于今早新加入的一个小老弟的提问,https://club.perfma.com/question/2079981

我又是 debug 又是反编译,总算是把那个问题给整明白了
https://github.com/jonwinters/jmm-research

另外关于 x64 的 lock 的语义,大家有兴趣上 Stack Overflow 看,
中文区我 Google 了一下,基本没有人能写博客给整明白的。

再次申明:我们是正经的技术内推交流群,希望有大佬加入讨论吹水,
哪怕是偶尔指点一下研究方向,也是不胜感激。

微信 ID: Y2hlbjExMjIwMDM3Cg==
4214 次点击
所在节点    程序员
52 条回复
ezksdo
2021-01-23 15:56:39 +08:00
你也不想想,不加 volatile 他就永远不写回内存吗?
lewis89
2021-01-23 16:05:15 +08:00
@ezksdo #41 我不知道 JVM 为什么会有这种优化,jitwatch 又不能 debug,我在 gdb 里面 已经看过了,那个内存地址读出来的值就是 0 ,无论多久都是 0,至于是主线程 读到的是未失效的 L1/L2 cache,还是什么,我就不在乎了
lewis89
2021-01-23 16:16:27 +08:00
@ezksdo #41

https://www.zhihu.com/question/263528143/answer/270308453

而且你从这个原答案里面可以看到
lock addl $0x0, (%rsp); 对 rsp 指针 + 0 操作是毫无意义的,rsp 是栈顶指针
lock 是让 cache 失效,保证可见性,如果可见性没有保证,代码依旧会死循环

而对 变量 i 加 volatile 属性 并没有使用 happen before
lewis89
2021-01-23 16:25:46 +08:00
@ezksdo #41 关键是我那个死循环的地方 你有留意看了没有,跟激进编译半毛钱关系都没有



第一步要通过 R15 寄存器 偏移 0x108 的位置去取值,

第二步才是跟存放了 立即值 0 的 RAX 寄存器比较

比较失败跳回第一步 ,这跟 JVM 激进优化有半毛钱关系? 分明就是 [R15 + 0x108] 寄存器的指针 取不到新的值
ezksdo
2021-01-23 16:28:03 +08:00
cache 以行为单位,打印函数有 lock 并不能导致 num 变量可见,写 volatile 就是 happens before volatile 读的,我不知道你说的使用是什么
lewis89
2021-01-23 16:35:51 +08:00
@ezksdo #45 如果读写 volatie.. 都是在同一个线程里面, 又何来一个线程 对 另外一个线程 观测到的 happen before ?
lewis89
2021-01-23 16:38:06 +08:00
@ezksdo #45 你要 A 线程 写了 volatile,另外一个 B 线程 后续去读 volatile,保障 B 线程能观测到 A 线程写 volatile 的事情都发生,这才算是 happen before
lewis89
2021-01-23 16:38:48 +08:00
你要 A 线程 写了 volatile,另外一个 B 线程 后续去读 volatile,保障 B 线程能观测到 A 线程写 volatile 之前的事情都发生,这才算是 happen before
lewis89
2021-01-23 16:39:11 +08:00
@ezksdo #45
你要 A 线程 写了 volatile,另外一个 B 线程 后续去读 volatile,保障 B 线程能观测到 A 线程写 volatile 之前的事情都发生,这才算是 happen before
lewis89
2021-01-26 18:37:36 +08:00
@ezksdo #45 我错了,我重新静态分析了一下,没错是 激进编译的问题

lewis89
2021-01-26 18:39:45 +08:00
@ezksdo #45 这几天在读 JVM 的操作数栈,忽然明白了这块,字节码所有的操作方法没有立即数,是使用操作数栈 来完成的,然后重新静态分析了一下,确实是 JVM 激进编译的锅
lewis89
2021-01-26 18:47:01 +08:00
@ezksdo #45 人外有人,山外有山,老哥有兴趣加个好友,相互交流一下吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739803

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX