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

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

test1:面试

test1这个例子加了volatile,因此程序正确退出输出test1 end后端

test2:多线程

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

test3:工具

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

推荐去个人博客阅读更多:spa

1.Java JVM、集合、多线程、新特性系列教程线程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程3d

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

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

以为不错,别忘了点赞+转发哦!

相关文章
相关标签/搜索