您好,欢迎来到暴趣科技网。
搜索
您的当前位置:首页volatile保证可见性的验证

volatile保证可见性的验证

来源:暴趣科技网

一、前言

    java内存模型中的可见性是指,当一个线程修改了共享变量的值后,其他线程可以立马知道这个修改后的值。在《》中有这么一段话:

    对于这一论点,网上鲜有论据。所以,笔者通过几个简单的例子来证明volatile确实可以保证可见性。

二、论证过程

    每个线程都有一个工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递依靠主内存来完成。

package ThreadPool;

public class VolatileTest {
    public boolean isShutdown;

    public boolean getShutdown () {
        return isShutdown;
    }

    public void shutdown () {
        isShutdown = true;
    }

    public class ReaderThread extends Thread {
        @Override
        public void run() {
            try {
                System.out.println("开始循环");
                while (!isShutdown) {

                };
                System.out.println("结束循环");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    public class WatchThread extends Thread {
        @Override
        public void run() {
            shutdown();
        }
    }
    
    public static void main(String[] args){
        try {
            VolatileTest volatileTest = new VolatileTest();
            volatileTest.new ReaderThread().start();
            //让主线程睡眠一秒,确保另一个线程调用shutdown方法时死循环已经开始
            Thread.sleep(1000);

            volatileTest.new WatchThread().start();
            //此刻的睡眠是为了确保shutdown方法对isShutdown变量的修改已经同步到主内存
            Thread.sleep(1000);
            //打印isShutdown的值
            System.out.println("getShutdown:" + volatileTest.getShutdown());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

    isShutdown是共享变量,默认值是false。ReaderThread线程的执行体是一个死循环,直到isShutdown变为true才跳出循环,打印“结束循环”。WatchThread线程的执行体调用了shutdown方法,将isShutdown的值改为true。如果说ReaderThread线程跳出了死循环,那么就说明WatchThread线程对isShutdown的修改是对其可见的,反之,则不可见。
    运行结果如下:

三、总结

    综上所述,volatile确实可以保证可见性。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoquwan.com 版权所有 湘ICP备2024080961号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务