1、要使volatile变量提供理想的线程安全,必须同时满足以下两个条件:
1)、对变量的写操作不依赖于当前值;
2)、该变量没有包含在具有其他变量的不变式中。 第一个条件的限制使volatile变量不能用作线程安全的计数器。虽然增了操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而volatile不能提供必须的原子特性。实现正确的操作需要使x的值在操作期间保持不变,而volatile变量无法实现这一点。 2、一般共享变量是存放中主内存中,每一个线程都有一个属于自己的工作内存;当一个线程开始时,会将变量从主内存中拷贝一份副本放在自己的工作内存中,当使用时就高效多了,当有更改时,会回写到主内存中;当此时有多个线程对同一个共享变量进行操作时,只会操作属于自己线程的工作内存,之后回写到主内存中,相互之间不会有影响,故此时会有多线程安全问题。当该共享变量使用volatile修改时,一个线程对其进行了修改,则其回写到主内存时,会告知其他有该共享变量的副本,该副本已经失效了,故其他线程要使用该共享变量时,就会重新从主内存中拷贝一份副本到本线程中,以确保其线程内使用的都是最新的。 3、一般一个线程对变量的操作需要经历从主内存中读取Read--->加载到工作线程中load---->在工作线程中使用use--->该该共享变量进行赋值asign--->对该共享变量进行存储store--->将该共享变量回写到主内存中write。 4、一个共享变量被volatile修饰之后,就具备两层含义:
1)、保证不同线程对这个变量进行操作时的可见性,即一个线程修改了变量的值,该变量的新值对其他线程来说是立即可见的,但不保证操作的原子性;
2)、禁止进行指令重排。 5、使用synchronized可以保证变量修改的可见性和原子性,而volatile只能保证变量的可见性;synchronized是重量级的加锁,且开销大,而volatile是轻量级的无锁,且开销小 6、对于volatile修饰的引用类型(包括对象、数组等),其仅仅是保证引用地址的可见性,而不是引用指向的对象中元素的可见性。 7、一般64位的long和double是非原子操作的,是使用高低32位来进行赋值的,故这种64位的变量的赋值是非原子操作的,但在现代JVM中,都已保证该赋值操作是原子操作的。 8、关于指令重排,是指处理器为了提高处理速度将一些指令重新排序,但保证最终的结果是一致的,跟重排前的结果一样,这种是允许的;而volatile能防止指令重排,可以认为是在指令中增加了内存屏障,使在该volatile修饰的变量所属的指令,在没有使用之前,其前面的指令可以放在该指令之后,其后面的指令同样可以放在该指令之前,但有了该修改,则不会这样。 参考:
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
http://www.infoq.com/cn/articles/ftf-java-volatile

最新文章

  1. Oracle 11g 新特性之Highly Available IP(HAIP)
  2. easycwmp在开发板上的配置
  3. 【poj2774】 Long Long Message
  4. OCJP(1Z0-851) 模拟题分析(五)over
  5. js 过滤敏感词
  6. Java in a Nutshell学习笔记
  7. mysql引擎区别
  8. Java基础之创建窗口——使用BoxLayout管理器(TryBoxLayout4)
  9. struts2 中的 result 返回类型是 json 的配置问题
  10. C/C++ 关于大小端模式
  11. Selenium RC配置
  12. 探秘Java虚拟机——内存管理与垃圾回收
  13. Meta http-equiv属性
  14. Struts2安装与简单部署实例
  15. JavaEE(12) - JPA规范及实现(TopLink和Hibernate)
  16. css(非表格变成表格用)
  17. Docker(一):Docker安装
  18. SAP S4系统创建Customer和Vendor的BAPI
  19. 解决Chrome浏览器访问https提示“您的连接不是私密连接”的问题
  20. 如何入门vue之一

热门文章

  1. VS模板文件修改,自动生成注释
  2. ExtJS MVC学习手记
  3. SQL中一种类似GUID值的函数实现
  4. hmmer 使用(转载)
  5. PostgreSQL中的引号和null
  6. android开发支付宝接口开发流程(密钥篇)
  7. android开发连接wifi addNetwork 返回-1
  8. 【Sort List】cpp
  9. VIMTUTOR《VIM教程》
  10. throttle/debounce: 为你的cpu减减压(前端性能优化)