volatile特性及原理

背景:
处理器在执行内存写操作时,先将数据写入缓冲期中,而不是直接写入高速缓存。所以在多核处理器时代,会产生变量可见性的问题。而编译器和执行期为提高性能会对指令进行重排序,在多线程环境下可能会造成结果不符合预期,而volatile提供了内存可见性已经禁止重排的特性。

保证内存可见性

现象
被volatile修饰的关键字,当发生修改后立即刷新到主内存,当其他cpu需要读取这个volatile变量时设置本地缓存中该变量地址无效,从主内存重新读取,实现了内存可见性

原理
编译器在编译时发现volatile,插入lock(即内存屏障)前缀指令,而lock有以下2个特性
1.写变量后会强制刷新回主内存
2.读该变量时会直接从主内存读取

禁止指令重排序

现象:JMM(java内存模型)基于happens-before原则基于volatile的写happens-before对volatile变量的读,实现执行顺序

原理:编译器发现一个volatile变量,那么在编译的时候会加入内存屏障(也就是指令),当cpu对这个变量做操作前后强制向主内存读写,而不经过cpu自己的本地缓存区

无法保证原子性&安全性

volatile无法保证原子性,因为对于一个变量的读操作,可以解释为以下3部分

  1. 读取volatile变量到本地
  2. 修改变量值
  3. local值写会主内存

所以在这3步中无法保证原子性,juc包中提供了automic*组件保证原子操作

### Java 中 `volatile` 的原理及实现机制 #### 1. **`volatile` 的基本作用** `volatile` 是一种轻量级的同步机制,用于确保多线程环境下变量的可见性和防止指令重排序。它主要用于修饰共享变量,使得这些变量的变化对其他线程立即可见[^1]。 #### 2. **Java 内存模型 (JMM)** 为了理解 `volatile` 的工作机制,需要先了解 Java 内存模型 (JMM)[^2]。JMM 定义了程序中的变量如何以及何时被多个线程访问和修改。在 JMM 中,每个线程都有自己的工作内存,而所有变量都存储在主内存中。当一个线程读取某个变量时,会从主内存复制一份到该线程的工作内存;写入操作则相反,会将数据从工作内存刷新回主内存。 然而,默认情况下,这种机制可能导致某些线程无法及时感知到另一个线程对共享变量所做的更新。通过使用 `volatile`,可以强制每次读取或写入操作都直接发生在主内存上,从而保证变量的可见性。 #### 3. **`volatile` 的具体行为** - **可见性**: 当一个变量被声明为 `volatile` 后,任何对该变量的写操作都会立刻刷回到主内存,并且后续其他线程对此变量的读取都将直接从主内存加载最新值[^4]。 - **禁止指令重排序**: 此外,`volatile` 还具有一定的顺序保障功能——它可以阻止编译器或者 CPU 对于涉及此标记变量的操作进行特定类型的优化(比如重新排列)。这意味着如果某一线程完成了对于某一 volatile 变量 A 的赋值,则在此之后发生的动作必然是在逻辑时间轴上的“后面”,即使硬件层面上可能尝试调整实际执行次序也不会违反上述约束条件[^3]。 以下是基于以上特性的简单代码示例: ```java public class VolatileExample { private static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(() -> { while(flag){ // do something here... } System.out.println("Thread stopped."); }).start(); Thread.sleep(100); new Thread(() -> { flag = false; System.out.println("Flag set to false"); }).start(); } } ``` 在这个例子当中,“flag”的状态改变会被第二个启动起来的新线程迅速察觉并作出反应,这得益于它的 volatile 属性所带来的即时通知效果。 #### 4. **性能对比与其他锁的区别** 相比传统的 synchronized 锁或是 ReentrantLock 等工具而言,由于不需要经历完整的加解锁流程也无需考虑复杂的队列管理等问题,因此采用 volatile 实现简单的跨进程通信往往具备更好的运行效率与更低的时间开销^。 但是需要注意的是,尽管如此高效便捷,但它并不能完全替代真正的互斥锁定手段来解决所有的并发控制难题。例如原子复合操作就超出了单一 volatile 能够胜任的能力范围之外。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值