volatile是java中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器 失去大量优化的机会。


  • 1,可见性

    可见性指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。

  • 2,禁止指令重排序优化

    禁止指令重排序优化。大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile关键字就可以从语义上解决这个问题。

    注意,禁止指令重排优化这条语义直到jdk1.5以后才能正确工作。此前的JDK中即使将变量声明为volatile也无法完全避免重排序所导致的问题。所以,在jdk1.5版本前,双重检查锁形式的单例模式是无法保证线程安全的。因此,下面的单例模式的代码,在JDK1.5之前是不能保证线程安全的。

最新文章

  1. gitlab web hook
  2. git 格式化输出版本信息
  3. AngularJs解决方案笔记(1)
  4. 水题 ZOJ 3876 May Day Holiday
  5. Falcon Genome Assembly Tool Kit Manual
  6. ubuntu1304下安装boa服务器
  7. php验证身份证号码正确性
  8. Linux系统查找文件find命令使用(不断更新)
  9. UITableViewCell 左滑删除
  10. Asp.Net MVC4配置Ext.Net
  11. CentOS服务器上的 git 包版本控制
  12. webpack的基本配置项
  13. 【转载】LINUX 和 WINDOWS 内核的区别
  14. Linux问题杂谈
  15. 什么是pear的channel?
  16. js深复制
  17. halcon之屌炸天的自标定(2)
  18. ThinkPHP自定义错误页面、成功页面及异常页面
  19. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳
  20. Java for LeetCode 134 Gas Station

热门文章

  1. C# 初学
  2. 使用xshell5 从CentOS主机download资料
  3. 用OpenGL进行立方体表面纹理贴图
  4. e839. 使JTabbedPane中的卡片可滚动
  5. Linux入门教程:如何检查Linux系统的最后重启时间
  6. t4 根据表名数组生成实体
  7. 纯CSS3实现牛奶般剔透的3D按钮特效
  8. 大爱HTML5 9款超炫HTML5最新动画源码
  9. A:LinkedList实现了List接口; B: AbstractSet实现了Set接口; C: HashSet继承自AbstractSet基类; D: WeakMap继承自 AbstractMap
  10. 面试的角度诠释Java工程师(一)