为了账号安全,请及时绑定邮箱和手机立即绑定

Java并发编程之验证volatile的可见性

标签:
Java

Java并发编程之验证volatile的可见性

通过系列文章的学习,凯哥已经介绍了volatile的三大特性。1:保证可见性 2:不保证原子性 3:保证顺序。那么怎么来验证可见性呢?本文凯哥将通过代码演示来证明volatile的可见性。

前期准备:

共享变量 number 初始值是0,然后修改后的值为100;

两个线程,分别是:主线程Main以及线程名为A的线程

内部类:

https://img2.sycdn.imooc.com/5e7574270001d53d05820303.jpg

可以看到有个方法将变量值修改成了100;

再来看看:

https://img4.sycdn.imooc.com/5e7574280001181709600416.jpg

说明:

变量number不用volatile关键字修饰。主线程在运行后,启动子线程。名字为线程A。然后线程A将变量number的值修改成了100后,主线程对number的进行判断。如果numbr的值等于0的时候,就一直while循环。我们预期下结果:线程A修改完数据之后,输出的是100呢还是0呢?最后运行结束这个是否会输出呢?

我们来看看输出的结果:

https://img3.sycdn.imooc.com/5e7574290001f72e09600400.jpg

可以看到控制台输出的结果,线程A更新完变量的值之后在自己内部获取到变量的值是更新后的,但是在主线程的工作缓存去获取后,依然是0.因为主线程依然还在运行着(红色按钮一直红色的),虽然线程A修改了共享变量的值,但是没有人通知主线程你获取的数据需要更新。这说明,在不用volatile修饰的时候,共享变量在线程A和主线程之间是不可见的。

我们再来试试使用volatile修饰共享变量后运行的结果。

使用volatile修饰变量

volatile int number = 0;

再来查看运行结果:

线程A 进入了。准备操作数据

线程A 更新数据完成。更新后的值为:100

==============main====运行结束.主线程Main获取到的值为:100

https://img1.sycdn.imooc.com/5e75742a0001b38009600224.jpg

结论:

我们可以看到,运行结束语句也输出了。并且主线程获取到number的值就是修改后的100.

这次操作和上次操作唯一区别就是变量number添加了volatile关键字来修饰,但是主线程竟然能够获取到线程A修改后的数据,从而证明了volatile能够保证共享变量在其他线程的可见性。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消