首页
编程随笔
Java笔记
Html/Css/Js
Android
后端笔记
服务器搭建
BUG收集
Java异常
Android异常
在线工具
Json格式化
Epub在线编辑
文字转图片
编码转换
文本对比
登录
发布文章
个人文章
退出登录
首页
编程随笔
Java笔记
Html/Css/Js
Android
后端笔记
服务器搭建
BUG收集
Java异常
Android异常
在线工具
Json格式化
Epub在线编辑
文字转图片
编码转换
文本对比
登录
发布文章
退出登录
搜索
当前位置:
首页
-
博客
- 正文
关闭
volatile关键字解析
更新时间:2022-03-27 14:54:10
阅读数:824
发布者:落幕
### 1、volatile三大特性 1) 可见性 2) 不保证原子性 3) 禁止重排序 #### (1)可见性 JMM(Java Memory Model)模型: 各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存操作后再写回主内存中的.  这就可能存在一个线程AAA修改了共享变量X的值还未写回主内存中时 ,另外一个线程BBB又对内存中的一个共享变量X进行操作,但此时A线程工作内存中的共享比那里X对线程B来说并不不可见.这种工作内存与主内存同步延迟现象就造成了可见性问题. #### (1) 禁止重排序 计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种  单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致. 处理器在进行重新排序是必须要考虑指令之间的数据依赖性 多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测