背景

学了六年C#,一直没有使用过 volatile,对多线程编程也是偶尔才会使用,这次学习 Java 又遇到了 volatile,准备稍微深入的了解一下。

volatile 的作用?

几乎所有支持这个关键字的语言给出的解释都一样:阻止编译器对字段访问和赋值的优化,直接从字段所在的空间取值(可能是值,也可能是引用),而非引入寄存器等优化措施(跟编译器的实现有关)。

使用 volatile 后对,字段的访问(this.field)和字段的赋值(this.filed = xxx)就是原子操作了,在多线程环境下,不需要使用 synchronized 进行访问,否则的话必须使用 synchronized 进行访问。

何时使用 volatile?

根据上文,我们很容易总结出一个规律:方法中只对字段就行了访问或赋值,volatile 和 synchronized可以结合使用,如下例:

 public class Program {
static Object locked = new Object();
static volatile int count; public static void main(String[] args) {
// TODO Auto-generated method stub } static int getCount() {
return count;
} static void resetCount() {
count = 1;
} static void increaseCount() {
synchronized (locked) {
count++;
}
}
}

备注

本文没有深入到编译后的字节码级别进行探讨(也有可能是影响JIT),所以不一定对,有深入了解的朋友,还请留言批评。

最新文章

  1. Jquery学习笔记 --ajax删除用户,使用了js原生ajax
  2. css3动画第一式--简单翻滚
  3. eclipse中去掉Js/javsscript报错信息
  4. android 提高进程优先级 拍照永不崩溃(闪退)
  5. trigger,triggerhandler模拟事件
  6. Asp.Net Mvc5新特性
  7. $(this) 和 this
  8. uva 10905 Children's Game (排序)
  9. cocoapod的安装与使用
  10. ehCache浅谈(转)
  11. APlayer组件自制播放器
  12. 如何用 Git 合并两个库,并保留提交历史
  13. AVFoundation自定义拍照
  14. Dynamics CRM项目实例之九:CRM 2015的产品中的捆绑销售
  15. [SDOI2017]天才黑客[最短路、前缀优化建图]
  16. day44前端开发1之html基础
  17. 浅析 Bigtable 和 LevelDB 的实现
  18. copy代码的时候,如何去掉代码前边的编号
  19. 在win10下使用docker快速搭建ruby开发环境
  20. Vivado中xilinx_courdic IP核(求exp指数函数)使用

热门文章

  1. POJ - 1251
  2. JAVA封装消息中间件调用二(kafka消费者篇)
  3. python基础(10)--模块
  4. python合并图片
  5. Expert C Programming 阅读笔记(~CH1)
  6. git与pycharm合并,珠联璧合
  7. AngularJS核心01:如何启动
  8. 【转】eval()函数用法
  9. 【BZOJ 4503】4503: 两个串 (FFT)
  10. 【Splay 总结】