java并发之原子性
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp17
1、原子性操作:
不能被线程调度机制中断的操作;--对原子性变量的赋值和返回操作通常都是原子性的
原子性可以用于除了long和double之外的所有基本类型上的简单操作(当做不可分的原子),但是JVM将64位的 (long 和double变量)读取和写入当成是两个分离的32位 操作来执行。
2、同步机制与可视性:
同步机制强制在处理器系统中,一个任务做出的修改必须在应用中是可视的,如果没有同步机 制,那么修改时可视性将无法确定。
3、关于volatile:
(1)当你定义long或者double的时候,如果使用volatile关键字,就会获得原子性(JDK 1.5之前不支持)
(2)volatile关键字还确保了应用中的可视性。
(3)当一个域的值依赖于他之前的值时(比如说自增)volatile就无法工作了。
(4)如果一个域的值受到其他域的值得限制,那么volatile也就无法工作了--例如Range类的lower和upper边界就必须遵守lower<=upper。
4、volatile、synchronized和主存:
(1)如果你将一个域声明为volatile,只要对这么域近些了写操作,那么所有的读操作都可以看到这个修改,即便使用了本地缓存,情况也确实如此,volatile域会立即写入到主存中,而读操作就发生在主存中。
(2)在非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务也不必看到该新值。
(3)同步也会导致向主存中刷新,因此一个域如果完全由synchronized方法或者语句块来保护,那就不必将其设置为volatile。
(4)一个任务进行的任何写入操作对于这个任务本生都是可视的。
(5)使用volatile而不是synchronized唯一安全的情况就是类中只有一个可变的域。--实现同步第一选择应该是synchronized。
1、原子性操作:
不能被线程调度机制中断的操作;--对原子性变量的赋值和返回操作通常都是原子性的
原子性可以用于除了long和double之外的所有基本类型上的简单操作(当做不可分的原子),但是JVM将64位的 (long 和double变量)读取和写入当成是两个分离的32位 操作来执行。
2、同步机制与可视性:
同步机制强制在处理器系统中,一个任务做出的修改必须在应用中是可视的,如果没有同步机 制,那么修改时可视性将无法确定。
3、关于volatile:
(1)当你定义long或者double的时候,如果使用volatile关键字,就会获得原子性(JDK 1.5之前不支持)
(2)volatile关键字还确保了应用中的可视性。
(3)当一个域的值依赖于他之前的值时(比如说自增)volatile就无法工作了。
(4)如果一个域的值受到其他域的值得限制,那么volatile也就无法工作了--例如Range类的lower和upper边界就必须遵守lower<=upper。
4、volatile、synchronized和主存:
(1)如果你将一个域声明为volatile,只要对这么域近些了写操作,那么所有的读操作都可以看到这个修改,即便使用了本地缓存,情况也确实如此,volatile域会立即写入到主存中,而读操作就发生在主存中。
(2)在非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务也不必看到该新值。
(3)同步也会导致向主存中刷新,因此一个域如果完全由synchronized方法或者语句块来保护,那就不必将其设置为volatile。
(4)一个任务进行的任何写入操作对于这个任务本生都是可视的。
(5)使用volatile而不是synchronized唯一安全的情况就是类中只有一个可变的域。--实现同步第一选择应该是synchronized。
博客已转移至 http://blog.yemou.net/