证明Volatile关键字的可见性

网上的好多代码程序说是证明可见性,但是有的电脑运行代码时,加不加volatile的结果都是一样的,也没有说清楚具体的情况,看了些博客并借鉴了一些文章总结了一下:以下代码可能你复制到本地,运行时不加volatile 主线程不会阻塞,换台电脑试试吧(我的电脑就不阻塞,用的同事电脑才能出现阻塞),解释都在代码里了!

package demo_019.wkb;

/**
 * Created by wkb on 2018/8/29.
 *
 *  不加volatile :
 *  现象1:主线程不加:Thread.sleep(10);线程1将flag改为true,主线程读取不到,主线程flag=false,主线程一直循环,(这种情况如果电脑性能好的话,可能出现不了,多找几台电脑试试)
 *  现象2:主线程加:Thread.sleep(10);那么主线程可以读取到线程1改变的flag值,说明线程1将flag值刷新到了公共内存中 此时两者都为true
 *
 * 加volatile:
 * 此时主线程加不加 Thread.sleep(10); 两个线程都会结束:flag 都为true,说明 volatile关键字是让变量变为线程之间可见
 *
 *
 */
class ThreadDemo1 implements Runnable {

    //共享变量
    private    boolean flag = false;

    public boolean getFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {

        try {
            Thread.sleep(200);
        } catch (Exception e) {
        }
        flag = true;
        System.out.println("其他线程flag=" + getFlag());
    }

    public static void main(String[] args) throws Exception {
        ThreadDemo1 td = new ThreadDemo1();
        new Thread(td).start();

        while (true) {
//            Thread.sleep(10); //不加这个,有的电脑就读取不到公共内存中的数据,主线程一直循环
            if (td.getFlag()) {
                System.out.println("主线程flag:" + td.getFlag());
                break;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/whxwkb/article/details/82190066