synchronized和volidate的区别在于synchronized提供了原子性 而volidate却没有该特性。
理解volidate的特性最好是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步
class VolidateExample{
private volidate long var = 1L;
private long getVar(){
return var;
}
private void getAndIncrement(){
var ++;
}
private void setVar(long var){
this.var = var;
}
}
若多线程访问VolidateExample ,程序语义和如下一样
class MultiVolidateExample{
private long var = 1L;
private synchronized long getVar(){
return var;
}
private void getAndIncrement(){
//var++和下方语义一样
var = getVar();
var += 1L;
set(var);
}
private synchronized void setVar(long var){
this.var = var;
}
}
由程序可以发现问题所在:对一个volatile变量的单个读/写操作,与对一个普通变量的读/写操作使用同一个监视器锁来同步,它们之间的执行效果相同。由happens-before规则的内存可见性保证了对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。