如何理解volidate不保证原子性

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变量最后的写入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容