volatile的使用原则】的更多相关文章

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/4352802.html volatile关键字 对于普通变量,在一个线程中更新变量值,则在其他线程中该变量的值并不会改变(存在时间差).如果需要在其他线程中立即可见,需要使用 volatile 关键字.volatile 不能代替锁,一般认为volatile 比锁性能好(不绝对). 例:两条线程,使用一个标志用于控制一条线程…
一.happens-before原则 同一个线程中的,前面的操作 happens-before 后续的操作.(即单线程内按代码顺序执行.但是,在不影响在单线程环境执行结果的前提下,编译器和处理器可以进行重排序,这是合法的.换句话说,这一是规则无法保证编译重排和指令重排). 1. 监视器上的解锁操作 happens-before 其后续的加锁操作.(Synchronized 规则) 2. 对volatile变量的写操作 happens-before 后续的读操作.(volatile 规则) 3.…
前言 上一章节简单介绍了线程安全以及最基础的保证线程安全的方法,建议大家手敲代码去体会.这一章会提到volatile关键字,虽然看起来很简单,但是想彻底搞清楚需要具备JMM.CPU缓存模型的知识.不要小看这个关键字,它在整个并发包(concurrent包)使用的非常广泛,掌握volatile关键字是非常重要的. 如果你是一个急性子,请看下面3点就行: 保证了多线程读取变量的可见性,一个线程修改volatile修饰的变量,另外一个线程会立即读取到新的值 禁止指令重排序 volatile关键字不会像…
话不多说,直接贴代码 class Singleton { private static volatile Singleton instance; private Singleton(){} //双重判空 public static Singleton getInstance() { if ( instance == null ) { synchronized (Singleton.class) { if ( instance == null ) { instance = new Singleto…
Java 理论与实践: 正确使用 Volatile 变量 原文:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html 总结: volatile变量自身具有下列特性: 可见性.对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入. 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性. 锁提供了两种主要特性:互斥(mutual exclusi…
volatile: 相当于轻量级的synchronized,只能用来修饰变量,线程安全的三个特性通过volatile能实现其中的两个 原子性: 在之前的文章有说到,通过Atomic相关类.synchronized.lock都能够实现原子性,也就是共享变量的访问互斥.但是volatile无法保证 可见性: 导致共享变量在线程间不可见的原因: 1.线程交叉执行 2.重排序结合线程交叉执行 3.共享变量的值没有在工作内存和主存之间及时更新 如何实现可见性: 1.通过加入内存屏障来实现 2.对volat…
上一篇学习了synchronized的关键字,synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile是一个轻量级的同步机制. 前面学习了Java的内存模型,知道各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理.一个CPU中的线程读取主存数据到CPU缓存,然后对共享对象做了更改,但CPU缓存中的更改后的对象还没有flush到主存,此时线程对共享对象的更改对其它CPU中的线程是不可见的. 而volatile修饰的变…
1.单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作. 2.锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作. 3.volatile的happen-before原则:对一个volatile变量的写操作happen-before对此变量的任意操作(当然也包括写操作了) 4.happen-before的传递性原则:如果A操作happen-before B操作,B操作happen-bef…
CPU的缓存一致性协议MESI 在多核CPU中,内存中的数据会在多个核心中存在数据副本,某一个核心发生修改操作,就产生了数据不一致的问题,而一致性协议正是用于保证多个CPU cache之间缓存共享数据的一致性. cache的写操作 write through 写通 每次CPU修改cache中的内容会立即更新到内存,也就意味着每次CPU写共享数据,会导致总线事务,因此这种方式常常会引起总线事务的竞争,虽然后高的一致性但是效率非常低. write back 写回 每次CPU修改了cache中的数据,…
单线程happen-before原则:      在同一个线程中,书写在前面的操作happen-before后面的操作. 锁的happen-before原则:          同一个锁的unlock操作happen-before此锁的lock操作. volatile的happen-before原则:  对一个volatile变量的写操作happen-before对此变量的任意操作(当然也包括写操作了). happen-before的传递性原则:   如果A操作 happen-before B操…