【轻松拿捏】什么是 volatile 关键字?它有什么作用?

什么是 volatile 关键字?它有什么作用?

一、概述

二、volatile的作用

1.可见性(Visibility)

2.有序性(Ordering) 

三、使用场景 

1.状态标志

2.双重检查锁定(Double-Checked Locking)

 四、volatile 的局限性

五、总结 


🎈边走、边悟🎈迟早会好

一、概述

volatile是 Java 中的一个关键字,用于修饰变量。它的主要作用是保证变量在多线程环境下的可见性和有序性。

二、volatile的作用

1.可见性(Visibility
  • 在多线程环境中,线程通常会将变量的值从主内存复制到自己的工作内存(CPU 缓存)中进行操作。如果一个线程修改了变量的值,但其他线程仍然从自己的工作内存中读取该变量的旧值,就会导致数据不一致的问题。
  • 当一个变量被声明为 volatile时,Java 内存模型确保该变量的所有读操作都会直接从主内存中读取,而写操作会直接写入主内存。因此,volatile 变量对所有线程都是可见的。
2.有序性(Ordering) 
  • Java 内存模型允许编译器和处理器对指令进行重排序,以优化性能。但这种重排序可能导致线程间的执行顺序不一致,从而引发潜在的并发问题。
  • 使用 volatile 修饰的变量可以禁止指令重排序。具体来说,Java 在 volatile变量的读/写操作时会插入内存屏障(Memory Barrier),从而保证在 volatile变量的操作前后的代码执行顺序不会被重排序。

三、使用场景 

1.状态标志

volatile 常用于声明状态标志变量,如布尔类型的 flag。多个线程可以通过 volatile 变量来判断程序的状态,从而控制程序的执行流程。

private volatile boolean running = true;

public void stop() {
    running = false;
}

public void run() {
    while (running) {
        // 执行任务
    }
}
2.双重检查锁定(Double-Checked Locking)

volatile 常用于实现线程安全的单例模式,尤其是在双重检查锁定(DCL)模式中

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

 四、volatile 的局限性

  • 不保证原子性volatile 仅保证变量的可见性和有序性,但无法保证操作的原子性。比如,对于 volatile 变量的自增操作 i++,这个操作其实是由三步(读取、增加、写回)组成的,中间可能会被其他线程打断,导致结果不一致。因此,如果需要保证操作的原子性,应该使用 synchronizedAtomic 类。
  • 适用场景有限volatile 适用于简单的状态标志或轻量级的读写操作。如果涉及复杂的状态或依赖于多个变量的并发逻辑,volatile 可能无法满足需求,此时应考虑使用锁机制或其他并发控制手段。

五、总结 

volatile 是 Java 中用于解决多线程环境下共享变量可见性问题的关键字。它保证了变量的可见性和有序性,但并不保证操作的原子性。volatile 适用于某些特定场景,如状态标志、双重检查锁定等,但在涉及复杂操作时,需要结合其他同步机制来确保线程安全。

 🌟感谢支持 听忆.-CSDN博客

🎈众口难调🎈从心就好

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值