自学内容网 自学内容网

浅谈volatile

volatile 是 Java 中的一个关键字,用于修饰变量,确保变量的可见性和禁止指令重排。以下是 volatile 关键字的几个关键点:
可见性(Visibility)
当一个变量被 volatile 修饰时,它保证了对该变量的读操作总是能够看到最近一次写操作的结果。这意味着当一个线程修改了 volatile 变量的值时,新值对于其他线程来说是立即可见的,无需进行额外的同步操作。
禁止指令重排(Ordering)
volatile 变量的写操作对于后续的读/写操作是“先行发生”的,这可以防止编译器和处理器对指令进行重排序。在没有 volatile 的情况下,编译器和处理器可能会对指令进行重排序以优化性能,这可能会导致多线程环境下的可见性问题。
与 synchronized 的区别
synchronized 关键字提供了比 volatile 更强的内存可见性和线程同步能力。synchronized 可以保证一个线程在访问代码块时,其他线程不能进入该代码块,从而实现线程同步。而 volatile 只保证了变量的可见性,不提供原子性保证。
使用场景
volatile 通常用于以下场景:
1.  状态标志:用于标志位,如一个线程的运行状态。
2.  双重检查锁定(Double-Checked Locking):用于延迟初始化时,确保类的实例只被创建一次。
3.  非阻塞算法:在某些非阻塞算法中,volatile 可以用于标记变量的状态,以保证操作的原子性。
限制
尽管 volatile 提供了可见性保证,但它并不适用于需要复合操作的场景。例如,递增操作 i++ 不能使用 volatile 来保证原子性,因为递增操作涉及到读取、增加和写回三个步骤,volatile 只能保证单个操作的原子性。
示例代码
public class VolatileExample {
    private volatile boolean running = true;

    public void stop() {
        running = false;
    }

    public void doWork() {
        while (running) {
            // 执行工作
        }
    }
}

在这个例子中,running 变量被 volatile 修饰,确保了在 stop 方法中对 running 的修改能够立即被 doWork 方法感知到,从而及时停止工作循环。
总的来说,volatile 是一个轻量级的同步机制,适用于简单的场景,但在需要更复杂同步控制时,应该考虑使用 synchronized 或 java.util.concurrent 包中的其他同步工具。


原文地址:https://blog.csdn.net/silver687/article/details/144166051

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!