class VolatileFeaturesExample{
volatile long v = 0L;
public void setV(long l) {
this.v = l;
}
public void getAndIncrement(){
this.v++;
}
public long getV() {
return v;
}
}
class VolatileFeaturesExample{
volatile long v = 0L;
public synchronized void setV(long l){
this.v = l;
}
public void getAndIncrement(){
long temp = getV();
temp += 1L;
setV(temp);
}
public synchronized long getV() {
return v;
}
}
class VolatileBarrierExample{
int a;
volatile int v1 = 1;
volatile int v2 = 2;
void readAndWrite(){
int i = v1; //第一个volatile读
int j = v2; //第二个volatile读
a = i + j; //普通写
v1 = i + 1; //第一个volatile写
v2 = j + 1; //第二个volatile写
}
}
volatile的内存语义
一个volatile变量的单个读/写,与一个普通变量的读/写操作用同一个锁来同步,它们之间的效果相同,看示例
简而言之,volatile变量有这两个特性
volatile的写-读内存语义和实现
为了实现volatile写/读的内存语义,Java内存模型会限制重排序的类型,下面是Java内存模型针对编译器指定的volatile重排序规则表
为了实现volatile内存语义,编译器在生成字节码的时候,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。
具体示例
内存屏障含义