我在互联网上遇到了以下 Java 类:
public class Lock1 implements Runnable {
int b=100;
public synchronized void m1() throws Exception {
b=1000;
Thread.sleep(50);
System.out.println("b="+b);
}
public synchronized void m2() throws Exception {
Thread.sleep(30);
//System.out.println("m2");
b=2000;
}
public void run() {
try {m1();}
catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
Lock1 tt=new Lock1();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}
尝试运行了很多次,结果几乎总是:
1000
b=1000
在我最初的猜测中,我认为第一行应该是“2000”,因为 tt.m2() 只是一个方法调用(不是线程),所以 main 方法应该继续执行并得到结果“b”作为一个在方法 m2 中被赋值为 2000。
我所做的第二次尝试是取消注释
System.out.println("m2")
在 m2 方法中。令人惊讶的是,结果几乎总是:
m2
2000
b=1000
为什么在 m2 方法中添加语句,会导致 tt.b 的输出值发生变化?
对不起,我在这里对线程和方法调用之间的区别感到很困惑,希望高手能帮忙!