美文网首页
如何理解volidate不保证原子性

如何理解volidate不保证原子性

作者: wifi四姨 | 来源:发表于2017-08-03 22:40 被阅读0次

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

    相关文章

      网友评论

          本文标题:如何理解volidate不保证原子性

          本文链接:https://www.haomeiwen.com/subject/tgrplxtx.html