Java 并发之《深入理解 JVM》关于 volatile 累加示例的思考

在周志明老师的 《深入理解 JVM》一书中关于 volatile 关键字线程安全性有一个示例代码(代码有些许改动,语义一样):

java 复制代码
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 的线程打印出来:

java 复制代码
Map<Thread, 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 的条件做了改造:

java 复制代码
while (Thread.getAllStackTraces().keySet().stream().filter((t) -> !t.isDaemon()).count() > 1) {
    Thread.yield();
}

这样程序就能够正常输出结果并退出了。

--------------########################------------------------

原示例代码使用 java 命令运行是没有问题的,只是在 IDEA 下运行会有上述问题,具体原因以及这些 daemon thread 的作用可参考这位老师的博文

另外,在第三版的该章节末尾,老师已经做了声明

相关推荐
CoderYanger15 分钟前
Java EE 进阶:2.3 JavaScript 综合案例
java·前端·javascript·css·职场和发展·java-ee·html
starzy199018 分钟前
Flink TimeWindow 详解及代码实现:从三种时间语义到滚动与滑动窗口
java·服务器·flink
重生之小比特19 分钟前
【Java SE】类和对象(一)
java·ide·intellij-idea
captain37626 分钟前
网络原理(4)-TCP
java·服务器·网络·网络协议·tcp/ip·java-ee
青山木29 分钟前
枚举类DP进阶:完全平方数与零钱兑换
java·数据结构·算法·leetcode·动态规划
小七在进步32 分钟前
类和对象(二)
java·开发语言
clz131452136 分钟前
风险特征平台架构设计与实现
java·flink
写后端的胖头鱼41 分钟前
【高频面试题】面试题里常出现的Bitmap是什么(附源码和多种场景)
java·开发语言·面试·位图·bitmap
benbenAItalk9 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl9 小时前
Java学习二 基本语法2, 算术运算符
java·学习