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