Java:java的原子操作和volatile
2012-02-29 11:18
316 查看
原文链接:/article/7553396.html
原子操作
所谓原子操作,就是"不可中断的一个或一系列操作" , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作 在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。
关于java中的原子性
原子性可以应用于除long和double之外的所有基本类型之上的“简单操作”。对于读取和写入出long和double之外的基本类型变量这样的操作 ,可以保证它们会被当作不可分(原子)的操作来操作。
volatile
当我们定义一个变量,假设就叫o吧,理论上讲,每次使用到o的时候,都应该从o的地址来读取这个变量,但是这存在一个效率问题,就是每次 使用o的时候都要从内存中去取值,然后通过系统总线传到CPU处理,这样开销会很大。所以编译器为了优化性能,把o放进CPU的Cache中,假如 o在赋值期间没有被改变,就直接从CPU的Cache里取o的副本来进行赋值。但是"bug"也显而易见,可能o已经被一个线程改变而重新写回了内存 ,但另一个线程并不知道,依旧按照原来的计划从CPU的Cache里读o的副本来取值,结果不幸发生了。 于是编译器的开发者为了补救这一"bug",提供了一个volatile让开发人员为他们的过失埋单,或者说提供给开发人员了一个选择效率的权利。
当变量加上了volatile时,编译器就老老实实的每次都从内存中读取这个变量值,否则就还按照优化的方案从cache里读。
在两个或者更多的线程访问的成员变量上使用volatile较好,当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
原子操作
所谓原子操作,就是"不可中断的一个或一系列操作" , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作 在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。
关于java中的原子性
原子性可以应用于除long和double之外的所有基本类型之上的“简单操作”。对于读取和写入出long和double之外的基本类型变量这样的操作 ,可以保证它们会被当作不可分(原子)的操作来操作。
volatile
当我们定义一个变量,假设就叫o吧,理论上讲,每次使用到o的时候,都应该从o的地址来读取这个变量,但是这存在一个效率问题,就是每次 使用o的时候都要从内存中去取值,然后通过系统总线传到CPU处理,这样开销会很大。所以编译器为了优化性能,把o放进CPU的Cache中,假如 o在赋值期间没有被改变,就直接从CPU的Cache里取o的副本来进行赋值。但是"bug"也显而易见,可能o已经被一个线程改变而重新写回了内存 ,但另一个线程并不知道,依旧按照原来的计划从CPU的Cache里读o的副本来取值,结果不幸发生了。 于是编译器的开发者为了补救这一"bug",提供了一个volatile让开发人员为他们的过失埋单,或者说提供给开发人员了一个选择效率的权利。
当变量加上了volatile时,编译器就老老实实的每次都从内存中读取这个变量值,否则就还按照优化的方案从cache里读。
在两个或者更多的线程访问的成员变量上使用volatile较好,当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
相关文章推荐
- Java中关于原子操作和volatile关键字
- Java中关于原子操作和volatile关键字
- 【转贴】Java中关于原子操作和volatile关键字
- Java单例的由浅入深----懒汉式的升级(2 原子操作、指令重排)懒汉式的最终版本(volatile)
- Java中关于原子操作和volatile关键字
- java并发:线程同步机制之Volatile关键字&原子操作Atomic
- Java中关于原子操作和volatile关键字
- java的原子操作和volatile
- i++ 是否为原子操作 和 Java中的volatile关键字
- java中volatile与原子操作
- Java中的原子操作和volatile关键字
- java原子性以及关键字volatile、synchronized
- java原子操作和同步块的比较
- Java实现原子操作的原理
- Java中的volatile关键字为什么不是不具有原子性
- volatile能保证long&double类型变量操作的原子性
- 从volatile说到,i++原子操作,线程安全问题
- java基本类型赋值操作的原子性
- java 并发操作之原子性与可视性
- 原子性操作和volatile