voliate的理解

作者: imbird | 来源:发表于2017-04-08 15:37 被阅读0次

    先MARK一个网址
    http://www.cnblogs.com/zemliu/p/3298685.html

    Voliate

    java并发编程实战中对同步的理解,强调了同步不只是synchronized还有 voliate.后者一般是修复属性使用。violate也是同步的一种方式

    网上基本上对violate的解释都是内存可见性,因为每个Thread都有属于它们自己的内存空间,这个线程做了对某些属性的更新操作,另一个线程不一定是看得到的。这个时候就是violate这个的作用了。

    我个人的理解 violate是一个弱同步的一个关键字

    • 每次修改volatile变量都会同步到主存中
    • 每次读取volatile变量的值都强制从主存读取最新的值(强制JVM不可优化volatile变量,如JVM优化后变量读取会使用cpu缓存而不从主存中读取)
    • 线程 A 中写入 volatile 变量之前可见的变量, 在线程 B 中读取该 volatile 变量以后, 线程 B 对其他在 A 中的可见变量也可见. 换句话说, 写 volatile 类似于退出同步块, 而读取 volatile 类似于进入同步块

    (补充第三点:

    public Class ViolateTest{
    private String A;
    private String B;
    private violate String C;
    }
    

    当这个时候有两个线程先设置A 再设置 B 再设置 C
    假如ABC 都不是violate的,拿另一个线程可能读到ABC都不是正确的值。当C用了violate以后
    前面A B 的值也会一起设置到主内存中去。所以这个时候violate有了同步块的效果

    为什么说它是弱同步关键字,因为它不能对I++ ++i这些CAS多步操作同步,要使这种复合操作同步的话,需要借用synchronized 和 atomicXX类的实现。

    相关文章

      网友评论

        本文标题:voliate的理解

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