标题 neta 自《计算机网络自顶向下》
思维导图
volatile 在 Java 中被称为轻量级 synchronized
。很多并发专家引导用户远离 volatile 变量,因为使用它们要比使用锁更加容易出错。但是如果理解了 volatile 能帮助你写出更好的程序。
- 当读比写更多时会获得比锁好相当多的性能
- 比锁更好的伸缩性
- 比锁使用方便,只需要声明变量即可,代码量小
内存语义
volatile 的讲解
为了方便理解 volatile,用代码来表示一下加了 volatile 的效果。
给变量加上 volatile 相当于在 get 和 set 方法中加了锁。
public synchronized int getX() {
return x;
}
public synchronized void setX(int x) {
this.x = x;
}
注意这里只保证了get 和 set 的原子性,当有其他操作的时候就不是原子性的了。
下面的操作不是原子性的,当个 5 个线程同时执行这个方法 100 次后出现的结果很可能小于 500。
volatile int x;
public void inc() {
x++;
}
原因是这个程序相当于
int x;
public synchronized int getX() {
return x;
<