免费设计软件网站,做it的中国企业网站,百度图片查找,怎么登陆wordpress在周志明老师的 《深入理解 JVM》一书中关于 volatile 关键字线程安全性有一个示例代码#xff08;代码有些许改动#xff0c;语义一样#xff09;#xff1a;
public class MyTest3 {private static volatile int race 0;private static void increase() {race;}public …在周志明老师的 《深入理解 JVM》一书中关于 volatile 关键字线程安全性有一个示例代码代码有些许改动语义一样
public class MyTest3 {private static volatile int race 0;private static void increase() {race;}public static void main(String[] args) {IntStream.range(0, 20).forEach((item) - {new Thread(() - IntStream.range(0, 10000).forEach(i - increase())).start();});while (Thread.activeCount() 1) {Thread.yield();}System.out.println(race);}
}老师的目的是为了说明在多线程环境下 volatile 关键字只能保证可见性而不是线程安全的。但是当在我的 IDEA 下运行时发现程序是没有输出结果且始终是终止不了的有点纳闷稍微一分析肯定是在 yield 这个地方有问题。所以尝试把当前 active 的线程打印出来
MapThread, StackTraceElement[] traces Thread.getAllStackTraces();
for (Thread thread : traces.keySet()) {System.out.println(thread.getName() , isDaemon thread.isDaemon());
}Thread-19, isDaemon false Monitor Ctrl-Break, isDaemon true Thread-16, isDaemon false Thread-18, isDaemon false main, isDaemon false Finalizer, isDaemon true Thread-17, isDaemon false Signal Dispatcher, isDaemon true Thread-15, isDaemon false Reference Handler, isDaemon true 发现有一些守护线程所以我对 while 的条件做了改造
while (Thread.getAllStackTraces().keySet().stream().filter((t) - !t.isDaemon()).count() 1) {Thread.yield();
}这样程序就能够正常输出结果并退出了。
--------------########################------------------------
原示例代码使用 java 命令运行是没有问题的只是在 IDEA 下运行会有上述问题具体原因以及这些 daemon thread 的作用可参考这位老师的博文
另外在第三版的该章节末尾老师已经做了声明