什么是volatile?什么是可见性?

volatile本意是易变的,就是说它修饰的变量可能经常被修改。

可见性就是说多线程访问一个共享变量的时候,任何的修改都会让所有的线程知道并且更新。

如何实现可见性?

计算机底层实现:多个CPU都有自己的高速缓存,但是都共享主内存;当多个CPU把内存中共享的变量读到自己的缓存中后(缓存行),如果进行了修改,就会让其他CPU的缓存行失效,所以下次再读取的时候就会去内存中读。

JVM实现:线程工作内存类似于缓存,JVM主内存类似于计算机的主内存。注意只是类似。对于线程工作内存和主内存的交互,JVM定义了8个原子操作:read、load、use、assign、store、write以及lock和unlock。关于这一块不细说,网上有很多教程解释的很清楚。

volatile能保证原子性吗?

i++是原子操作吗?不是。

i++的执行过程可以分为3个操作的组合:

x = i;

y = x + 1;

x = y;

所以当多线程执行i++操作时,即使变量i被声明为volatile,最后的结果还是不可预料。

也就是说,volatile只能保证可见性,而不能保证原子性。

最新文章

  1. C#向PPT文档插入图片以及导出图片
  2. linux mysql 操作命令
  3. ASP.NET MVC必知必会知识点总结(二)
  4. PHP中的日期加减方法示例
  5. BZOJ2535 [Noi2010]Plane 航空管制2
  6. swing 复选框
  7. VS2010/MFC字体和文本输出:文本输出
  8. golang http server分析(一)
  9. iOS开发之UITabBarController
  10. kobo阅读器安装koreader
  11. JAVA 反射(1)
  12. Ocelot中文文档-委托处理程序
  13. CF1095E Almost Regular Bracket Sequence
  14. ios中input获取焦点时的问题
  15. NoSuchFieldError
  16. [20171120]理解v$session的state字段(11G).txt
  17. Node remains in conflict,svn冲突解决办法
  18. BBC曝光:每天10000步,竟是商家的营销骗局
  19. Python delattr() 函数
  20. qtp descriptive programming multiple language(多语言支持)

热门文章

  1. python 语句:条件、循环、break、continue...
  2. ATM取款小项目
  3. Hibernate基础学习(七)—检索方式
  4. python作业设计:多级菜单,并可依次进入各级子菜单
  5. vue2.0版cnode社区项目搭建及实战开发
  6. 【算法】RMQ LCA 讲课杂记
  7. 用 Python 和 Stanford CoreNLP 进行中文自然语言处理
  8. 浩哥解析MyBatis源码(十二)——binding绑定模块之MapperRegisty
  9. Angularjs快速入门(二)
  10. sed命令详解-应用篇