为了账号安全,请及时绑定邮箱和手机立即绑定

关于多线程之间变量的可见性

/ 猿问

关于多线程之间变量的可见性

慕粉3291149 2019-05-06 09:21:03
package com.example.demo.synchronized_test;

import lombok.Data;

public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        S s = new S();
        if(s.isFlag()){
            System.out.println("flag is true");
        }
        T1 t1 = new T1(s);
        t1.start();
        Thread.sleep(500);
        T2 t2 = new T2(s);
        t2.start();
        Thread.sleep(500);
        if(s.isFlag()){
            System.out.println("flag is true");
        }else{
            System.out.println("flag is false");
        }
    }
}

@Data
class S{
    private boolean flag = true;
}

class T1 extends Thread{

    private S s;

    public T1(S s) {
        this.s = s;
    }

    @Override
    public void run() {
        System.out.println("begin t1 ...");
        while(s.isFlag()){

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

class T2 extends Thread{

    private S s;

    public T2(S s) {
        this.s = s;
    }

    @Override
    public void run() {
        s.setFlag(false);
    }
}

程序运行结果,如下图所示:

https://img2.mukewang.com/5ccf8b800001d17304870069.jpg

有个疑问,t1线程和main线程应该都感知不到t2线程对变量flag的修改,但是结果证明t1线程感知不到,但是main线程能感知到,这时为什么呢

查看完整描述

1 回答

已采纳
?
慕无忌7406412

你为什么会觉得t1线程和t2线程都感知不到s里面的flag变量呢?其实它们两个都能感知得到,你只需要把你t1里面的run方法改一下,就可以知道.见下图:

https://img1.mukewang.com/5cf0969d000190b404960562.jpg

https://img3.mukewang.com/5cf096a100017fa305990215.jpg


查看完整回答
1 反对 回复 2019-05-31
  • 慕粉3291149
    慕粉3291149
    你好,按照你说的确实可以,但是我不太懂为什么会这样,Thread.sleep()的作用难道是让出cpu,让cpu有时间去从主内存中拿到最新的值吗

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信