volatile关键字总结
2017-06-27 18:50
162 查看
Thinking in java中volatile关键字内容总结
第一部分 volatile保证可视性
原子性可以应用于处long和double之外的所有基本类型之上的“简单操作”,但是JVM可以将64位的读取和写入当作两个分离的32位操作来执行(字撕裂)。
当你定义long或double变量时,使用volatile,就会获得原子性
在多处理器系统上,相对于单处理器系统而言,可视性问题远比原子性问题多得多。一个任务做出的修改,即使在不中断的意义上讲是原子性的,对其他任务也可能是不可视的。
如,修改只是暂时性地存储在本地处理器的缓存中,因此不同的任务对应用的状态有不同的视图。
volatile关键字保证了应用中的可视性。如果你将一个域声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改,即便使用了本地缓存,情况也是如此,volatile域会直接写到主存中。
非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务可能看不到这个新值。
如果多个任务同时访问某个域,那么这个域就应该是volatile的,否则,这个域就应该只能经由同步来访问。同步机制也会导致在主存中刷新,因此如果一个域有synchronized方法或语句块来防护,不必使用volatile。
在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,
因此volatile变量是一种比sychronized关键字更轻量级的同步机制。
相同都是
保证了写入和读取都直接操作内存,不会进行内存的重排序或CPU cache等操作,保证可视性
使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域
尽管某个操作是原子性操作,但是仍有可能在其处于不稳定的中间状态时被读取。
在没有同步的情况下对共享可变值进行了访问,即使共享可变值设置为volatile,解决了多任务的可视性问题
但仍有可能在其处于不稳定的中间状态时被读取。
解决方案是添加同步控制
第一部分 volatile保证可视性
原子性可以应用于处long和double之外的所有基本类型之上的“简单操作”,但是JVM可以将64位的读取和写入当作两个分离的32位操作来执行(字撕裂)。当你定义long或double变量时,使用volatile,就会获得原子性
在多处理器系统上,相对于单处理器系统而言,可视性问题远比原子性问题多得多。一个任务做出的修改,即使在不中断的意义上讲是原子性的,对其他任务也可能是不可视的。
如,修改只是暂时性地存储在本地处理器的缓存中,因此不同的任务对应用的状态有不同的视图。
volatile关键字保证了应用中的可视性。如果你将一个域声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改,即便使用了本地缓存,情况也是如此,volatile域会直接写到主存中。
非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务可能看不到这个新值。
如果多个任务同时访问某个域,那么这个域就应该是volatile的,否则,这个域就应该只能经由同步来访问。同步机制也会导致在主存中刷新,因此如果一个域有synchronized方法或语句块来防护,不必使用volatile。
第二部分:volatile和synchronized的区别
不同在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,
因此volatile变量是一种比sychronized关键字更轻量级的同步机制。
相同都是
保证了写入和读取都直接操作内存,不会进行内存的重排序或CPU cache等操作,保证可视性
使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域
第三部分:volatile不能解决“原子性操作但是仍需要同步控制”的问题
“原子操作不需要进行同步控制”是不正确的。尽管某个操作是原子性操作,但是仍有可能在其处于不稳定的中间状态时被读取。
在没有同步的情况下对共享可变值进行了访问,即使共享可变值设置为volatile,解决了多任务的可视性问题
但仍有可能在其处于不稳定的中间状态时被读取。
解决方案是添加同步控制
相关文章推荐
- 关键字:auto、static、register、const、volatile 、extern 总结
- C/C++ volatile关键字用法总结
- java多线程基础总结【一】volatile关键字与原子性问题
- volatile关键字使用总结
- Java volatile关键字总结
- Java——多线程总结及ThreadLocal、Volatile、synchronized、Atomic四个关键字
- 【转】Java多线程编程中易混淆的3个关键字( volatile、ThreadLocal、synchronized)总结
- java并发编程synchronized、volatile关键字及ReentrantLock类总结
- 关于java的volatile关键字吐血总结
- volatile关键字总结
- Static、Extern、Volatile及Const关键字总结
- 关键字:auto、static、register、const、volatile 、extern 总结
- 并发编程总结之volatile关键字
- java volatile关键字总结
- 关键字:auto、static、register、const、volatile 、extern 总结
- 关键字:auto、static、register、const、volatile 、extern 总结
- volatile关键字用法总结
- volatile关键字学习总结
- Volatile关键字总结
- 关键字:auto、static、register、const、volatile 、extern 总结