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);
????}
}
程序運行結(jié)果,如下圖所示:有個疑問,t1線程和main線程應(yīng)該都感知不到t2線程對變量flag的修改,但是結(jié)果證明t1線程感知不到,但是main線程能感知到,這時為什么呢
3 回答
已采納

慕無忌7406412
TA貢獻4條經(jīng)驗 獲得超1個贊
你為什么會覺得t1線程和t2線程都感知不到s里面的flag變量呢?其實它們兩個都能感知得到,你只需要把你t1里面的run方法改一下,就可以知道.見下圖:
添加回答
舉報
0/150
提交
取消