关于volatile的一些理解

Posted

tags:

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

什么是volatile?什么是可见性?

volatile本意是易变的,就是说它修饰的变量可能经常被修改。

可见性就是说多线程访问一个共享变量的时候,任何的修改都会让所有的线程知道并且更新。

 

如何实现可见性?

计算机底层实现:多个CPU都有自己的高速缓存,但是都共享主内存;当多个CPU把内存中共享的变量读到自己的缓存中后(缓存行),如果进行了修改,就会让其他CPU的缓存行失效,所以下次再读取的时候就会去内存中读。

JVM实现:线程工作内存类似于缓存,JVM主内存类似于计算机的主内存。注意只是类似。对于线程工作内存和主内存的交互,JVM定义了8个原子操作:read、load、use、assign、store、write以及lock和unlock。关于这一块不细说,网上有很多教程解释的很清楚。

 

volatile能保证原子性吗?

i++是原子操作吗?不是。

i++的执行过程可以分为3个操作的组合:

x = i;

y = x + 1;

x = y;

所以当多线程执行i++操作时,即使变量i被声明为volatile,最后的结果还是不可预料。

也就是说,volatile只能保证可见性,而不能保证原子性。

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

java编程,如何彻底理解volatile关键字?

理解volatile

关于单例模式中volatile的使用

Java并发多线程编程——volatile关键字

关于JAVA 中volatile使用的一些笔记

你真的了解volatile关键字吗?