前言
- 当声明共享变量为volatile后,对这个变量的读/写将会很特别。为了揭开volatile的神秘面
纱,下面将介绍volatile的内存语义及volatile内存语义的实现。
volatile的应用与底层原理详见:《volatile的应用与底层原理》
volatile的特性
- 理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。下面通过具体的示例来说明,示例代码如下。
class VolatileFeaturesExample {
volatile long vl = 0L; // 使用volatile声明64位的long型变量
public void set(long l) {
vl = l; // 单个volatile变量的写
}
public void getAndIncrement () {
vl++; // 复合(多个)volatile变量的读/写
}
public long get() {
return vl; // 单个volatile变量的读
}
}
假设有多个线程分别调用上面程序的3个方法,这个程序在语义上和下面程序等价。
class VolatileFeaturesExample2 {
long vl = 0L; // 64位的long型普通变量
public synchronized void set(long l) {
// 对单个的普通变量的写用同一个锁同步
vl = l;
}
public void getAndIncrement () {