Volatile关键字

定义:当一个变量被定义成volatile之后,他将具备两种特性
1.可见性
2.禁止指令重排
解释1:可见性
这里的可见性指的是,当一个线程改变了这个变量的值,那么这个新值对于其他线程来说是可以立即得知的。
这里有必要解释一下JVM的内存模型。如下图:
在这里插入图片描述
当一个线程要对一个普通变量进行写操作,首先是先将改变量读到工作内存,然后在工作内存进行修改操作,然后再将新值回写到主内存中。
好了,有了上面的前提,我们再来说一下volatile修饰的变量,如果变量被volatile修饰,那么一旦这个变量被修改了,其他线程都会立即知道。当被修改之后,再去读取这个变量得时候,就会去主存中读取新值。
注意:这里的 立即知道被修改 并不能保证并发情况下的线程安全问题。
例如:A B两个线程同时对count修改,并且同时读取到了旧值,然后同时去修改,A线程修改成功,B线程此时知道变量得值被修改了,但是此时B线程并没有去读取新值,因为 此时B线程只剩下修改操作了,所以B线程 直接进到写操作,此时就会发生并发安全问题。
再举个例子,更好得理解为什么有可能引发并发安全问题
变量count=30
线程A 线程B
当线程A将count修改为29,B线程能够立即知道这个变量已经被修改了,当B线程要读取这个变量得时候,会去主存中读取,而不是在自己得工作空间中读取。然后B线程再将新值写回主存。(这种情况就没发生并发问题)。

注意看,使用volatile是有可能引发并发安全问题的,细节一点说,就拿上面的例子,如果B线程在A线程读这个变量的值之后,写这个变量的值之前,B要是已经读到了这个变量的值,那么就会引发并发安全问题。如果B在A修改之后再去读这个变量的值,就不会引发并发安全问题。

再说明一下,如果这里count不使用volatile,也会引发并发安全问题。那么可能就有人会觉得,那使用volatile对于并发问题有什么效果呢?这里只能说,使用volatile和不适用volatile对于并发问题上的区别,在于,A线程修改新值后,如果使用了volatile修饰,那么新值会立即到主存,而且其他的线程立即知道。如果没使用volatile修饰,那么新值只是在A线程的工作内存中被修改了,主存中的值还没有变,这个新值不是立即被写到主存的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值