Java深入理解volatile

本文介绍了Java中volatile关键字的工作原理及其背后涉及的缓存一致性机制。通过具体代码示例展示了如何利用volatile来确保多线程环境下的变量可见性。

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

public class VolatileTest {
    /**
     * volatile的实现原理
     * 在生成汇编代码时,对于被volatile修饰的变量,进行写操作时会多出lock前缀的指令。
     * 这个指令所带来的影响:
     *  1.将当前处理器缓存行的数据写回主内存。
     *  2.这个写回主内存的操作会是其他内存中改变量的内存地址失效。
     *
     *  如果对声明了volatile的变量进行写操作,jvm会向处理器发送一条lock前缀的指令,将这个变量
     *  所在缓存行中的数据写回到主内存中。同时时其他线程中改变量的内存地址失效。当其他线程对改变量进行
     *  写操作时,会发现其缓存中的变量的地址已失效,就回去主内存中重新读取改变量的值到处理器缓存中。
     */

    private static volatile boolean flag = false;

    public static void main(String[] args) {
        Thread aThread = new Thread(new Runnable() {
            public void run() {
                while(!flag){//线程读取flag=false
                    System.out.println(flag);
                }
            }
        });
        aThread.start();
        try {
            Thread.sleep(1000);//主线程睡1秒
            flag = true;//修改主线程flag 此时aThread的缓存中的flag失效,需要重新读取flag flag = true;循环结束。
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值