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

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 条回复
lewis89
2020-12-29 16:36:51 +08:00
@hun2008hun #16 纠结 System.out ? System.out 本身在 JIT 下也是有一个 lock 指令生成的,刚好就是这个 lock 之类充当了内存栅栏
lewis89
2020-12-29 16:37:46 +08:00
Cowhitewhite
2020-12-29 16:38:05 +08:00
求拉:Y293aGl0ZXdoaXRl
cnzjl
2020-12-29 16:52:21 +08:00
求拉 R2xhZE1vbnN0ZXI=
hun2008hun
2020-12-29 17:13:30 +08:00
@lewis89 因为 demo1 有 bug,而且严谨说不一定死循环,只是你的 cpu 是这样。 第二个问题:lock 的话要不把 sleep(1000)去掉再跑下?
lewis89
2020-12-29 17:30:20 +08:00
@hun2008hun #25 我管它有没有 bug? 只要是代码 确实有人会这么想 也这么犯傻用过,我就去查问题出在哪里就好了,我 JDK8 在树莓派上就没这个事情,你去掉 sleep(1000)又要为什么,它这个本来就是要循环去读,主线程循环 10 秒钟后还是读不到最新的值,那又是为什么。
只有用 lock 才能读到,lock 本身就是有内存栅栏的特性,我早就知道这个特性,这个东西只是验证 告诉你怎么一回事。
lewis89
2020-12-29 17:31:32 +08:00
@hun2008hun #25 而且我在很多库的代码里面都看到有人用 volatile 去做可见性的同步,但同时并未使用 happen-before 语义
junziyangyang
2020-12-29 18:18:21 +08:00
求拉 feng-junzi
HAluelue
2020-12-30 09:08:33 +08:00
求拉 andyis1iin
GunsRose
2020-12-30 09:16:38 +08:00
求拉 songtao22
will2zuo
2020-12-30 10:12:34 +08:00
求拉 zz546398578
young1lin
2020-12-30 13:54:35 +08:00
使用 System.out 会导致锁粗化的。。。你可以看看极客时间的专栏《 Java 并发编程实战》有一章的评论里面就说过,我记得是日志打印的那一章。
lewis89
2020-12-30 13:57:51 +08:00
@young1lin #32 这个问题跟锁粗化没有关系,而是 lock 的语义 有内存栅栏的作用
young1lin
2020-12-30 16:00:58 +08:00
@lewis89 我看错了,我是🐷,我就看到那个 monitorexit 了
lewis89
2020-12-30 16:24:55 +08:00
@young1lin #34 monitorexit 下面的实现比较复杂 每个平台都不一样
ezksdo
2021-01-23 14:40:33 +08:00
原文里就有答案,能扯这么多。有 lock 就全局可见了?都锁的不是一个位置。
lewis89
2021-01-23 14:53:46 +08:00
@ezksdo #36 哈,你不想研究就算了,不要瞎批评,我还真就告诉你 X86 有 lock 就能保障可见性 好吗? 跟锁不锁一个位置没有任何关系
lewis89
2021-01-23 14:55:34 +08:00
@ezksdo #36 相同的语义 还有 mfence 会强制其它 CPU 刷写 write buffer
lewis89
2021-01-23 15:03:17 +08:00
@ezksdo #36 请问 mfence MESI TSO NUMA 你了解几个? 你了解过了 再来批评也不迟
ezksdo
2021-01-23 15:55:07 +08:00
推荐你用 jitwatch 吧,看你 gdb 用得也费劲。这里就是 jit 优化,而打印函数有副作用,没有优化

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

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

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

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

© 2021 V2EX