Java 中多线程安全问题实例分析
案例
可能的结果
结果得到下图(结论1图)
image.png
按理说应该是这样的啊
image.png
对,你想的没错,但是线程A,B的count值都等于3也是有可能的,下面我们来分析下。
详细分析
对于代码中45行,i--其实在JVM中,其实可以分为3步。
获取count值(从主内存获取值)
count减1(在各自寄存器完成)
保存count(刷新到主内存)
详细说下A,B实际上在机器中过程
A线程获取cpu的count值为5,A线程先减去1,保存count值为4刷新到主内存,此时还没有执行System.out.println打印count值。如下图所示
image.png
切换到B线程,此时B线程的count值为4,因为B线程是从主内存取的,B线程count值减去1为3,此时刷新到主内存,主内存值变为3
image.png
切换到A线程,执行System.out.println count=3
切换到B线程,执行System.out.println count=3
C D E线程正常执行
这就是<结论1图>的执行过程。
结论
多线程安全一直是个很重要的话题,希望大家都能尽快理解掌握,希望大家喜欢!
我是叫练,多叫多练,欢迎大家和我一起讨论交流,我会尽快回复大家,喜欢点赞哦。
版权声明: 本文为 InfoQ 作者【叫练】的原创文章。
原文链接:【http://xie.infoq.cn/article/490c30a662fd8940a2c4cf9fb】。文章转载请联系作者。
评论