volatile
2015-11-22 10:13
295 查看
volatile关键字还确保了应用中的可视性。如果讲一个域声明为volatile的,那么只要对这个域残生了写操作,那么所有的读操作
就都可以看到这个修改。即便使用了本地缓存,情况也确实如此,volatile域会立即被写入到主存中,而读取操作就发生在主存中。
在非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务也不必看到这个新值。如果多个任务在同时访问这个
域,那么该域也应该是volatile,否则,这个域就应该只能经由同步来访问。同步也会导致向主存中刷新,因此如果一个域完全有synchronized
方法或语句块来保护。那就不必将其设置为是volatile。
一个任务所做的任何写入操作对这个任务来说都是可视的,因此如果它只需要在这个任务内部可视,那么你就不需要将其设置为
volatile的。
当一个域的值依赖于他之前的值时(例如递增一个计数器),volatile就无法工作了。如果这个域的值受到其他的域的值的限制,那
么volatile也无法工作,例如Range类的lower和upper边界就必须遵循lower<=upper的限制
基本上,如果一个域可能会被多个任务同时访问,或者这些任务中至少有一个是写入任务,那么就应该将这个域设置为volatile的。
如果将一个域定义为volatile,那么它就会告诉编译器不执行任何移除读取和写入操作的优化。这些操作的目的是用线程中的局部变量
维护对这个域的精确同步。实际上,读取和写入都是直接针对内存的,而却没有被缓存。但是,volatile并不能对递增不是原子性操作
这一事实产生影响。
注意:使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域。再次提醒,你的第一选择应该使用synchronized
关键字,这是最安全的方式,而其他所有方式都是有风险的
以上来至java编程思想
就都可以看到这个修改。即便使用了本地缓存,情况也确实如此,volatile域会立即被写入到主存中,而读取操作就发生在主存中。
在非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务也不必看到这个新值。如果多个任务在同时访问这个
域,那么该域也应该是volatile,否则,这个域就应该只能经由同步来访问。同步也会导致向主存中刷新,因此如果一个域完全有synchronized
方法或语句块来保护。那就不必将其设置为是volatile。
一个任务所做的任何写入操作对这个任务来说都是可视的,因此如果它只需要在这个任务内部可视,那么你就不需要将其设置为
volatile的。
当一个域的值依赖于他之前的值时(例如递增一个计数器),volatile就无法工作了。如果这个域的值受到其他的域的值的限制,那
么volatile也无法工作,例如Range类的lower和upper边界就必须遵循lower<=upper的限制
基本上,如果一个域可能会被多个任务同时访问,或者这些任务中至少有一个是写入任务,那么就应该将这个域设置为volatile的。
如果将一个域定义为volatile,那么它就会告诉编译器不执行任何移除读取和写入操作的优化。这些操作的目的是用线程中的局部变量
维护对这个域的精确同步。实际上,读取和写入都是直接针对内存的,而却没有被缓存。但是,volatile并不能对递增不是原子性操作
这一事实产生影响。
注意:使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域。再次提醒,你的第一选择应该使用synchronized
关键字,这是最安全的方式,而其他所有方式都是有风险的
以上来至java编程思想
相关文章推荐
- 图——操作用邻接表存储的图
- Android的一些总结
- JavaWeb之-------------网页中的Cookie技术
- App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
- Plist文件的操作
- 初入iOS自学问题笔记
- sql无法启动MSSQLSERVER,报错17051
- myEclipse中配置maven
- 配置IIS7支持解析json文件
- bootStrap table+ajax加载数据
- 利用MATLAB画一些简单图形
- picasso vs UIL
- 26.c/c++程序员面试宝典-访问控制
- Win7-其中的文件夹或文件已在另一个程序中打开
- Tomcat中JVM内存溢出及合理配置
- Qt 改变形状的对话框
- Java static关键字总结
- Linux下编译的第一个程序
- 【郝斌数据结构自学笔记】30-34_栈的定义_栈的分类_栈程序演示_栈的日常具体应用
- 复杂网络入门读物