关于System.out.println的多线程并发问题

本文转载自 IT江湖,原文链接:Click me

如果println函数的参数为常量则不会出现线程并发问题,但是如果参数为表达式形式,则JVM在执行println函数的时候会分为几步来执行,从而造成并发问题。

如下例子所示:

执行的结果为:
张三执行了2000,当前余额:12000
李四执行了3600,当前余额:15600
王五执行了2700,当前余额:18300

老牛执行了1300,当前余额:20200
老朱执行了800,当前余额:21000
老张执行了600,当前余额:18900

通过反编译,上面println函数的主要处理过程分为下面三步:

所以可以看出上面程序的执行顺序为:、

张三执行完->李四执行完->王五执行完->老张只执行到加操作,被老牛打断->老牛执行完->老朱执行完->老张执行剩下的输出操作

要想有一个正常的输出顺序,应该修改代码为:

结果为:
张三执行了2000,当前余额:12000
王五执行了2700,当前余额:14700
老张执行了600,当前余额:15300
老牛执行了1300,当前余额:16600
老朱执行了800,当前余额:17400
李四执行了3600,当前余额:21000

【注意】这里使用了一个对象锁,来控制对并发代码的访问。不管运行多少次,执行次序如何,最终余额均为21000,这个结果是正确的。有关原子量的用法很简单,关键是对原子量的认识,原子仅仅是保证变量操作的原子性,但整个程序还需要考虑线程安全的。

发布了10 篇原创文章 · 获赞 2 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章