voliate的理解

先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类的实现。

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

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,366评论 11 349
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,140评论 0 8
  • 本文基于周志明的《深入理解java虚拟机 JVM高级特性与最佳实践》所写。特此推荐。 衡量一个服务性能的高低好坏,...
    阳光的技术小栈阅读 1,104评论 0 3
  • 昨天,我听妈妈说今天我和我的小同学要一起去玩,我高兴极了,一直盼着赶紧到周日中午,今天上午我们都没有下楼,妈妈说我...
    昊昊的每一天阅读 288评论 0 0
  • 因为是你所以愿意,一起加班,一起去玩,一起做饭,一起做蛋糕,一起散步,一起逛街,一起去超市, 因为是你,想和你做很...
    33174dada65f阅读 77评论 0 0