关于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 变量》,今天我就先理解到这些了。
时间: 2024-10-11 18:16:05