当前位置: 首页 > 后端技术 > Java

Java并发——volatile关键字

时间:2023-04-01 14:19:07 Java

大家好,我是奇喵小屋,一个分享技术和生活的博主。以下是我的主页。各首页同步更新优质博客。创建起来并不容易。请关注挖金首页知乎首页Segmentfault首页开源中国首页将发布更多MySQL、Redis、并发、JVM、分布式等面试热点知识,以及Java学习路线、面试重点、职业规划、面对面的经验和其他相关的博客。转载请注明出处!1.volatile的作用1.1保证变量的可见性一个volatile变量的修改对所有线程都是可见的,体现在读写上。当一个线程修改了自己本地内存中的volatile变量时,会立即刷新到主内存中去读取某个线程。如果线程要读取volatile变量,JMM会将线程对应的本地内存设置为无效,线程只能从主内存中获取。1.2保证变量的单次读写是原子性的(JMM不保证64位数据double或long的读写操作的原子性),对于i++等复合操作,还是没有原子性。volatile只保证变量的单一读写是原子的,复合操作没有原子性1.3禁止指令重排序保证顺序当程序对volatile变量执行读写操作时,对前一个操作的所有改变必须有进行了,结果对后续操作可见。在执行指令优化时,volatile语句不能与其他语句重新排序。当编译器生成字节码时,它会插入一个内存屏障来禁止指令的顺序。当前面的所有操作都同步到主存后),后面插入一个StoreLoad来阻塞每次volatile读操作——前面插入LoadLoad和LoadStore2。锁通过CAS写入volatile变量。变量的操作必须是原子的(i++不行)