volatile

本文介绍了并发编程的三个重要特性:原子性、可见性和有序性,指出volatile关键字可保证可见性和禁止指令重排。还阐述了CPU内存模型中缓存不一致问题及解决方式,以及JDK 1.2前后Java内存模型的差异,强调volatile能让JVM从主存读写变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并发编程的三个重要特性

原子性: 一个或一组操作,一旦开始,不会被线程调度机制打断,直到结束,中间不会有任何线程切换。要么所有操作全部执行,要么所有操作都不执行。synchronize 可保证代码片段的原子性;

可见性: 一个线程对共享变量进行了修改,其它线程都可以立刻看到修改后的值。volatile 关键字可以保证共享变量的可见性;

有序性: JVM 执行代码过程是有先后顺序的,但并非是代码编写顺序,Java 编译器以及JIT可能在运行期间对代码指令优化,进行指令重排。volatile 关键字可以禁止指令进行重排序优化。

CPU 内存模型

在这里插入图片描述
图片引用自 JavaGuide

CPU 处理速度远大于内存处理速度,CPU Cache 是解决CPU和内存速度不对等的。

CPU Cache 从内存中复制一份数据进来,运算完成后协会到内存中,多核多线程处理时就会出现缓存和内存数据不一致的问题。

CPU 通过制定缓存一致协议或其他方式解决缓存不一致的问题。

JMM - Java 内存模型

在这里插入图片描述
图片引用自 JavaGuide

JDK 1.2 之前 Java 内存模型实现总是从内存读取数据,不存在不一致问题;

JDK 1.2 之后Java线程把变量保存到线程内存中,不从内存直接读取数据,多线程操作同一个数据时可能会造成数据不一致。

如何解决呢?看下图:

在这里插入图片描述
图片引用自 JavaGuide

volatile 关键字标识 JVM 表名,这个变量是共享且不稳定的,每次使用它都要到主存中进行读取,处理完成后写回到主存;

volatile 关键字还会防止 JVM 指令重排;

volatile 关键字保证变量的可见性。

小结

  1. volatile 关键字指示 JVM 绕过线程本地内存到主内存读取变量、处理、写回主存;
  2. volatile 关键字防止 JVM 指令重排;
  3. volatile 保证变量的可见性;

参考

JavaGuide - volatile 关键字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值