多线程同步工具——volatile变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程同步工具——volatile变量相关的知识,希望对你有一定的参考价值。

关于volatile,找了一堆资料看,看完后想找一个方法去做测试,测了很久,感觉跟没有一样。

这本书《深入理解Java内存模型》,对volatile描述中有这样一个比喻的说法,如下代码所示,对a的读写相当于对b的同步读写。

public volatile int a = 0;
private int b = 0;

public synchronized int getB(){
    return b;
}

public synchronized void setB(int b){
    this.b = b;
}

也就是说,volatile只保证了读与写的同步,每次读取都是得到最新值,每次写入都是覆盖最新值。

这就暗示着,非volatile变量的读写并非最新值,因为每个线程都有自己独立的内存保存着变量的副本,并非第一时间读取公共内存的变量。

现在,道理是明白的,接下来主要看它使用的场合和条件。

写入值不能依赖于读取值,例如a++,其实是一个“先读取,再运算,后写入”的步骤,存在了写入值依赖于读取值。

它除了读与写需要同步外,还需要其它操作的同步,那么其它操作的同步,无疑肯定要借助于synchronized。如果它的读与写的频率远远高于其它操作的同步,这时候就可以考滤volatile与synchronized的并用。

关于其它的用处,可以查看这篇文章正确使用 Volatile 变量》,今天我就先理解到这些了。

 

以上是关于多线程同步工具——volatile变量的主要内容,如果未能解决你的问题,请参考以下文章

juc学习一(volatile关键字及原子变量)

多线程中主存与线程工作空间同步数据的时机

43道多线程面试题,附带答案

Java高并发同步Volatile的使用

Java高并发同步Volatile的使用

Java并发编程之多线程同步