证明volatile的可见性和原子性

640?wx_fmt=png

 volatile作用

  • 保证内存可见性

  • 防止指令重排序

  • 注意:并不保证原子性

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值

内存可见性

volatile保证可见性的原理是在每次访问变量时候都会进行一次刷新,因此每次访问都是准没存中最新的版本,所以volatile关键字的作用之一就是保证变量修改的实时可见性

使用volatile使用必须的条件

  1. 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值

  2. 该变量没有包含在具有其他变量的不变式中

volatile使用建议

  • 在两个或者更多的线程需要访问的成员变量上使用volatile,当腰访问的变量已在shnchronized代码块中或者常量时,咱们就没要使用volatile

  • 由于使用volatile屏蔽调JVM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字

volatile和synchronized区别

1:volatile不会进行枷锁操作,volatile变量是一种微弱的同步机制在访问volatile变量时不会执行解锁操作,因此不会执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。

2:volatile变量作用类似于同步变量读写操作,从内存可见性的角度来看,写入volatile变量相当于退出同步代码块,而读取volatile比那辆相当于进入同步代码块。

3:volatile不如synchronized安全,在代码中如果过度使用volatile变量来控制状态的可见性,通常会比使用锁的代码更脆弱,也更难以理解,仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用volatile,一般来说,使用同步机制会更安。

4:volatile无法同事保证内存可见性和原子性,加锁机制(同步机制)既可以确保可见性又可以确保原子性,而volatile只能保证可见性,原因是声明为volatile的简单变量如果昂墙纸与该变量以前的值相关,那么volatile关键字不起作用,也就是说下面的表达式都不是院子操作的:count++,i++。

可见性demo证明

640?wx_fmt=png

输出,一直执行中,证明这个一个线程修改后其他线程并不知道,导致while循环一直执行

640?wx_fmt=png

给quit变量加一个volatile修饰

640?wx_fmt=png

输出

640?wx_fmt=png

不保证原子性demo证明

640?wx_fmt=png

输出结果多变: 

第一种结果

640?wx_fmt=png

第二种结果

640?wx_fmt=png

第三种

640?wx_fmt=png

第四种

640?wx_fmt=png

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田哥coder

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值