Volatile详解

13 篇文章 0 订阅
2 篇文章 0 订阅

JMM三大特性:可见性,原子性,有序性.

可见性

volatile轻量级。
在这里插入图片描述
在这里插入图片描述

保证可见性代码验证:

在这里插入图片描述
在这里插入图片描述

结果:没有输出mission is over。

在这里插入图片描述

加上volatile

在这里插入图片描述

结果:有一个线程修改了值,其他的线程会收到通知,立马输出。

在这里插入图片描述

总结:

在这里插入图片描述

原子性

vlolatile不保证原子性
在这里插入图片描述
代码验证:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
如果正常能保证原子性,结果应该为20000,运行多次都没达到20000。

1.因为每个线程初始都是把开始值为0放入自己的工作内存,线程1把值增加为2写入主内存,线程2把值增加成1也写回主内存,就会覆盖线程1的值,所以最终会出现值不为20000的结果。
2.在这里插入图片描述

解决:

解决一:synchronized可以保证原子性。

在这里插入图片描述
在这里插入图片描述

解决二:使用juc下面的atomic

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

有序性

单线程不会出现,多线程才会有出现这个问题
在这里插入图片描述
例子一:
在这里插入图片描述
由于是多线程,会对指令重排,会有不同的结果。
在这里插入图片描述
例子二:
在这里插入图片描述
顺序执行结果为6.
但是再多线程,指令重排后,可能先执行 flag=true ,然后执行a=a+5 最后答案为5.

总结:
在这里插入图片描述
在这里插入图片描述

哪里地方用到volatile?

在这里插入图片描述

多线程环境下,单例出现了问题。
在这里插入图片描述
解决:加synchronized
解决二:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果不加volatile的话,因为对象实例化有3步,如果发生了指令重排,获取的instance对象可能还没完成初始化对象,为null。所有需要加上volatile。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值