欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

分享一个诡异的可见性问题

程序员文章站 2022-05-04 11:50:22
之前介绍过可见性的特性,最近做测试的时候发现了一个很诡异的问题,下面看看这三个例子。 test1: test1这个例子加了volatile,所以程序正确退出输出test1 end test2: test2这个例子没有加volatile,程序也正常退出并输出一堆0并输出了test2 end,这是为什么 ......

分享一个诡异的可见性问题

之前介绍过可见性的特性,最近做测试的时候发现了一个很诡异的问题,下面看看这三个例子。

test1:

分享一个诡异的可见性问题

test1这个例子加了volatile,所以程序正确退出输出test1 end

test2:

分享一个诡异的可见性问题

test2这个例子没有加volatile,程序也正常退出并输出一堆0并输出了test2 end,这是为什么呢?没有加volatile为什么也有可见性?看起来是很诡异的问题,问题是在while里面加了一行system..输出问题,打开源码看println方法里面加了synchronized同步块,正是因为这个同步块保证了里面变量x的可见性,这个诡异的问题也就解开了。

分享一个诡异的可见性问题

test3:

分享一个诡异的可见性问题

test3这个例子即没加volatile,也没有在while里面加system..输出语句,所以线程对变量n3的修改对主线程不可见,程序一直循环,没有输出结果。

推荐去我的博客阅读更多:

1.java jvm、集合、多线程、新特性系列教程

2.spring mvc、spring boot、spring cloud 系列教程

3.maven、git、eclipse、intellij idea 系列工具教程

4.java、后端、架构、阿里巴巴等大厂最新面试题

觉得不错,别忘了点赞+转发哦!