栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

volatile有什么用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

volatile有什么用

先上一段小程序
public class Main {

    static boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        m();
        Thread.sleep(1000);
        running = false;
        System.out.println("set running = false");
        Thread.sleep(1000);
        System.out.println(running);
    }

    public static void m() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("start...");
                while (running) {

                }
                System.out.println("end...");
            }
        }).start();
    }
}

这是一个非常简单的小程序,在m方法如果running为true就是死循环,但是在主线程休眠1秒后会将running设置为false使之跳出循环打印end...接下来我们将程序运行起来看一下

D:devopenjdk-18.0.2binjava.exe -javaagent:D:devideaIC-2022.1.4.winlibidea_rt.jar=60387:D:devideaIC-2022.1.4.winbin -Dfile.encoding=UTF-8 -classpath D:devjava-codeJavaObjectLayoutJavaObjectLayouttargetclasses;C:UsersAdministrator.m2repositoryorgopenjdkjoljol-core.16jol-core-0.16.jar org.example.Main
start...
set running = false
false

从运行结果上看并没有跳出whlie就是但是running确实被设置为false了,接下来我们将running变量加上volatile修饰再看下运行效果

D:devopenjdk-18.0.2binjava.exe -javaagent:D:devideaIC-2022.1.4.winlibidea_rt.jar=60397:D:devideaIC-2022.1.4.winbin -Dfile.encoding=UTF-8 -classpath D:devjava-codeJavaObjectLayoutJavaObjectLayouttargetclasses;C:UsersAdministrator.m2repositoryorgopenjdkjoljol-core.16jol-core-0.16.jar org.example.Main
start...
set running = false
end...
false

在加上volatile之后while才正常的跳出循环这是因为如果不加volatile的话running在线程之间是不可见的,线程每次使用running是直接从寄存器中取值第二个线程修改running的值第一个线程并不知道导致直接从寄存器中取值而寄存器中的值始终为true导致不会跳出循环

volatile的作用就是告诉寄存器你缓存行中的值可能是不正确的,需要从主内存中取值,volatile还有个作用就是禁止指令重排序,在前后两条指令互不关联时cpu指令是可能进行重排序的导致在多线程下出现问题所以需要多线程共享的变量我们需要使用volatile修饰

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号