Java并发编程一:volatile关键字

本文通过三个示例代码展示了Java中volatile关键字的作用。通过对比加与不加volatile的情况,演示了其在线程间同步变量更新的功能。

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

在网络上找了好多关于volatile的文章,一直没有找到体现volatile作用的代码示例,本文通过代码给大家介绍一下volatile的作用。如有不正之处,欢迎批评指正。


示例一:

public class TestWithVolatile {
    private volatile static boolean bChanged;

    public static void main(String[] args) throws InterruptedException {
        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    if (bChanged == !bChanged) {
                        System.out.println("!=");
                        System.exit(0);
                    }
                }
            }
        }.start();

        Thread.sleep(1);

        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    bChanged = !bChanged;
                }
            }
        }.start();
    }
}

这是网上找的一段示例,被无数个猿类喷了,大家纷纷说加不加“volatile”结果都一样,楼主没验证程序就把代码贴出来了,我建了个工程run了这段代码,确实如大家所说,加不加“volatile”都会输出“!=”。于是乎自己接着上网找资料,找能够说明volatile作用的代码,无意中看到了“在多线程环境下,volatile能够保证线程获取到最新的数据”多线程这几个字在我心中一闪,于是我开始改造上面的示例代码

示例二:

public class TestWithVolatile {
    private static volatile boolean bChanged;

    public static void main(String[] args) throws InterruptedException {
        for(int i = 0; i < 10; i++){
            new Thread() {
                @Override
                public void run() {
                    for (;;) {
                        if (bChanged == !bChanged) {
                            System.out.println("!=");
                            System.exit(0);
                        }
                    }
                }
            }.start();
        }

        Thread.sleep(1);

        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    bChanged = !bChanged;
                }
            }
        }.start();
    }
}

我启动了10个做判定条件的线程,run了代码,这时候volatile的作用体现出来了,不加volatile的代码一直出于运行状态,加了volatile的代码马上就exit了。感觉到volatile的作用了,接着我又调整了一下代码。

示例三:

public class TestWithVolatile {
    private static volatile boolean bChanged;

    public static void main(String[] args) throws InterruptedException {
        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    bChanged = !bChanged;
                }
            }
        }.start();

        Thread.sleep(1);

        for(int i = 0; i < 10; i++){
            new Thread() {
                @Override
                public void run() {
                    for (;;) {
                        if (bChanged == !bChanged) {
                            System.out.println("!=");
                            System.exit(0);
                        }
                    }
                }
            }.start();
        }
    }
}

我把10个判定条件的线程移到代码的后面,run代码,发现加不加“volatile”都可以快速的exit程序。

为什么会是这样的?以下是我的推测
示例二中:先建立10线程同时获取bChanged的值,这是volatile起到了作用能够使个线程获取最新的值。
示例三中:先设置bChanged值,后获取bChanged的值,for循环创建线程,创建第一个线程,就相当于示例一的代码了,有可能在没有创建完全部线程的时候,第一个创建的线程已经exit程序了。所以加不加volatile执行结果都一样。分享给大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值