volatile关键字理解使用

volatile关键字

我们都知道volatile修饰的变量,保证了数据内存的可见性。

强迫每个线程在读取volatile修饰的变量值时,需要从主内存中读取。保证数据一经改变,其它线程立即感知。

其实就是 当我们界面中用volatile修饰的变量 ,只要修改 就会写到内存中 ,其他线程需要读取这个字段时,必须从主内存中 读取最新的变量值

具体什么情况下使用呢?

比如我们设置一个开关,在一个线程完成某件事情时,其他所有线程将不再继续执行新任务。

 

具体代码如下

不加volatile修饰时是这样的

测试结果

如上可以看出,虽然开关已经在main线程中关闭,但是,多线程任务中判断并没有停止,持续进行着f(),并没有看到 thread over 提示。一直没有等到。

 

加上volatile修饰测试如下

如上可以看到,在外部开关关闭的时候,多线程任务也随机终止了。如此可见volatile的用处了。

强迫每个线程在读取volatile修饰的变量值时,需要从主内存中读取。保证数据一经改变,其它线程立即感知。

 

注意 以下的方法 也做到了对内存数据刷新 可以断开开关

如果在多线程任务中,调用同步方法,或某些native方法(如Thread.sleep),会刷新线程内存数据,多线程任务也会根据开关的新值,断开任务。

如下

 

volatile只能保证数据更新后的其他线程的时时可见性,并不能保证操作的原子性。 要保持安全性需要ync包裹

需要搞清除的是,什么时候,线程内存数据跟主内存数据进行交换、更新。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值