JAVA多线程—共享变量的可见性问题

一、简介

我们知道线程在工作的时候有自己的私有内存,工作内存。程序运行的时候从主内存拉取需要的变量到工作内存,处理完再返回主内存。这篇文章总结哪些代码会使线程去主内存拉取变量。

二、volatile

volatile修饰的变量,不论什么语句都会从主内存拉取变量。
在这里插入图片描述

该程序能顺利完成,不会死循环。因为“isStop ”用volatile修饰了

三、synchronized

调用其他synchronized加锁的代码块,系统会从主内存拉取变量。
在这里插入图片描述
这种情况同样不会死循环。
注意,synchronized加锁后用到的变量才会从主内存拉取。

四、不会从主内存拉取的操作

只要不影响到变量的值,变量不参与运算,则不会从主内存中拉取,比如while,if,赋值给其他变量,作为方法参数等,如下图代码:
在这里插入图片描述
这种情况,程序会死循环。它获得的isStop永远都是false。

如果调用了被synchronized加锁的方法,或者方法中有被synchronized加锁的代码块,那么变量将会从主内存中拉取。即使锁的是毫不相干的对象,同样会使得变量从主内存拉取,如下图这里的System.out.println锁的是PrintStream的实例。
在这里插入图片描述
在这里插入图片描述

五、从主内存中拉取的操作

变量被赋值,变量参与计算,比如加减乘除,字符串拼接,++,–等操作,线程休眠会使从主内存中拉取变量。下图这些情况都不会出现死循环:
在这里插入图片描述在这里插入图片描述

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值