在看了 https://www.v2ex.com/t/1102734 这篇帖子后,我动手了试了一下。
有两个问题搞不懂,希望得到大佬解答(代码附在留言中):
问题一、 主线程 唤醒 后,会导致子线程不再主动从 主内存 刷新数据到 工作内存?
Thread.sleep(100);
添加这行代码,会导致直接死循环卡住,只有 t0 线程的相关操作得到执行。这个问题原帖 op 也问到了。
然后更神奇的是,当我用 jstack 查看线程状态的时候,发现实际上 t0 、t1 、t2 都处于 runnable 的状态。此时如果尝试用 jprofier 连接 jvm ,会报错相关端口被占用,而代码会马上执行下去。
再有,如果改成 Thread.sleep(1); 运行则不会卡住。经过多次尝试,发现 sleep 特定时长,可以产生输出数字到一半卡死的现象。而且使用 jdk8 和 jdk17 ,这个数字一般是 3 左右,使用 jdk21 则是 28 左右。
看上去就好像,主线程睡醒后,在主线程睡着之前就开 run 的线程不会再去主动同步主内存了一样?
问题二、Thread.currentThread() 会导致 jdk17 及以下版本死循环?
System.out.println(Thread.currentThread().getName() + " : " + su.getA());
这段代码在 jdk17 会死循环,但是在 jdk21 中不会。
研究了老半天没搞懂,菜鸡真心求教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.