【并发编程】volatile简单使用

本文深入探讨了Java中volatile关键字的作用,包括保证变量的可见性和防止指令重排序,以及如何通过示例代码展示其在多线程环境下的效果。

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

Atomic 以更为轻量的方式实现原子性。。本次我们学习 volatile 关键字,则是用来解决可见性、有序性问题。

简介

在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。

要解决这个问题,就需要把变量声明为volatile,这就指示 JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。

说白了, volatile 关键字的主要作用就是保证变量的可见性然后还有一个作用是防止指令重排序。通过之前的例子来回顾下 volatile 的作用,例子很简单,主线程试图通过修改 flag 的值,来触发 visableThread 线程打印自己线程 name。

使用

通过之前的例子来回顾下 volatile 的作用,例子很简单,主线程试图通过修改 flag 的值,来触发 visableThread 线程打印自己线程 name。

private static class ShowVisibility implements Runnable{
        public static Object o = new Object();
        private volatile Boolean flag = false; 
        @Override
        public void run() {
            while (true) {
                if (flag) {
                    System.out.println(Thread.currentThread().getName()+":"+flag);
                }
            }
        }
    }

public static void main(String[] args) throws InterruptedException {
        ShowVisibility showVisibility = new ShowVisibility();
        Thread visableThread = new Thread(showVisibility);
         visableThread.start();
        //给线程启动的时间
        Thread.sleep(500);
        //更新flay
        showVisibility.flag=true;
        System.out.println("flag is true, thread should print");
        Thread.sleep(1000);
        System.out.println("I have slept 1 seconds. Is there anything printed ?");
}  

代码中使用 volatile 修饰 flag 变量。这确保在多个线程并发时,任何一个线程改变了 flag 的值都会立即被其它线程所看到。以上程序 main 线程修改了 flag 值后,visableThread 能够立即打印出自己的线程 name。但如果我们把 flag 前的 volatile 去掉,可以看到 main 线程修改了 flag 值后,visableThread 也不会有任何输出。也就是说 visableThread 并不知道 flag 值已经被修改。

总结

volatile 关键字可以用来修饰实例变量和类变量。被 volatile 修饰后,该变量或获得以下特性:

  • 可见性。任何线程对其修改,其它线程马上就能读到最新值;
  • 有序性。禁止指令重排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值