证明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;
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值