先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类的实现。
网友评论