volatile详解

Posted weixin_46401390

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile详解相关的知识,希望对你有一定的参考价值。

特性:

1、可见性

每个线程都是将共享变量复制到自己的高速缓存空间里的,是每个线程修改后,然后再同步到内存空间。volatile会让线程直接读取内存空间里的变量值,从而解决由于高速缓存空间带来的并发问题

2、有序性

java执行会存在指令重排序的情况,执行第二行代码时不一定会等待第一行代码完全执行完毕,所以会存在一定的并发问题。
volatile会确保变量之前的代码都执行完毕后才执行。

3、volatile不能完全确保线程安全。

因为java执行时不能确保原子性,例如:
i=i+1 会分解成3步:
(1)获取i的值
(2)计算i=i+1
(3)回写i到内存

线程1读取了t的值,假如t = 0。之后线程2读取了t的值,此时t = 0。
然后线程1执行了加1的操作,此时t = 1。但是这个时候,处理器还没有把t = 1的值写回主存中。这个时候处理器跑去执行线程2,注意,刚才线程2已经读取了t的值,所以这个时候并不会再去读取t的值了,所以此时t的值还是0,然后线程2执行了对t的加1操作,此时t =1 。
这个时候,就出现了线程安全问题了,两个线程都对t执行了加1操作,但t的值却是1。所以说,volatile关键字并不一定能够保证变量的安全性。

以上是关于volatile详解的主要内容,如果未能解决你的问题,请参考以下文章

volatile简介与原理

volatile实现原理

volatile关键字

java之用volatile和不用volatile的区别

volatile简要解析

volatile关键字原子性和可见性