volatile 浅谈

在Java中,volatile 关键字是一种轻量级的同步机制,它用于确保变量的可见性和有序性,但不保证原子性。当我们说 volatile 屏障时,我们实际上是在讨论 volatile 变量如何影响Java内存模型(JMM)中的操作重排序和内存可见性问题。

可见性

当一个变量被声明为 volatile 时,它会保证对这个变量的修改会立即被其他线程看到。这是因为对 volatile 变量的读写操作会插入特定的内存屏障(Memory Barrier),这些屏障会阻止编译器和处理器对指令进行重排序,从而确保操作的顺序性和可见性。

有序性

在Java内存模型中,为了提高性能,编译器和处理器可能会对指令进行重排序。但是,volatile 变量会阻止这种重排序的发生,尤其是在以下两个方面:

  1. volatile写操作之前的读/写操作不会被重排序到volatile写操作之后。
    在这里插入图片描述
  2. volatile读操作之后的读/写操作不会被重排序到volatile读操作之前。
    在这里插入图片描述

这种防止重排序的特性就是所谓的 volatile 屏障。

屏障类型

  1. 写屏障(Write Barrier):在 volatile 变量的写操作之前,确保所有之前的操作都已经完成并更新到主内存中,这样后续的读操作就能看到最新的值。

  2. 读屏障(Read Barrier):在 volatile 变量的读操作之后,确保所有后续的操作都基于这个最新的volatile变量的值。

实际应用

volatile 通常用于以下场景:

  1. 确保一个变量的修改对所有线程可见。
  2. 作为一个简单的锁机制,用于控制对某个状态的访问(但请注意,它并不提供互斥性)。
  3. 禁用指令重排序。

然而,需要注意的是,volatile 并不适合所有并发场景。对于需要保证复合操作(如i++)原子性的情况,或者需要更复杂的同步机制(如互斥锁)时,应该使用其他同步工具,如 synchronized 关键字、ReentrantLock 或 Atomic 类。

总之,volatile 屏障是确保 volatile 变量操作顺序性和可见性的重要机制,它通过阻止指令重排序来实现这一点。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值