volatile关键字讲解

volatile关键字主要有两个作用
1.保证变量的内存可见性
2.禁止指令重排(内存栅栏)

1.讲到内存可见性就要必须要讲到java的内存模型JMM(Java Memory Model)
JMM 定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。

通俗讲上面话的意思就是实例变量和类变量不仅存在主内存中,每个线程还自己存了一份。
在这里插入图片描述
如上图线程A修改了某个共享变量的值,线程B读的是自己的本地内存第一时间是不知道的。这儿就出现了著名的内存可见性问题。
解决内存可见性问题有两种方案:
一种是加锁(线程获取到锁之后,会清空本地内存,重新从主内存中拷贝共享变量,之前设计程序的时候,设计到多条线程共享一个变量我大多都是用这样的方法的)。
第二种就是使用 volatile 关键字修饰共享变量,volatile 保证了不同线程对共享变量操作的可见性,也就是说一个线程修改了 volatile 修饰的变量,当修改后的变量写回主内存时,其他线程能立即看到最新值。这儿使用了总线嗅探机制
总线嗅探机制主要解决的是cpu缓存一致性问题,每个处理器监听监听总线上的数据,检查自己的缓存数据内存地址是否修改,如果发现不一致将缓存数据失效,下次使用会重新从主内获取。

使用 volatile 和 synchronized 锁都可以保证共享变量的可见性。相比 synchronized 而言,volatile 可以看作是一个轻量级锁,所以使用 volatile 的成本更低,因为它不会引起线程上下文的切换和调度。但 volatile 无法像 synchronized 一样保证操作的原子性。

2.禁止指令重排,
为了提高处理速度, JVM 会对代码进行编译优化,也就是指令重排序优化,但是并发编程下指令重排序也会带来一些安全隐患。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值