public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2500); //在在这里睡一下跟不睡结果不同,怎么会呢?
b = 2000;
}
public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}
如上代码段,运行结果为:
1000
b=1000
如果将注释的那一行代码去掉,运行结果为:
2000
b=1000
为什么会这样啊?不是在主线程main中运行到t.start()重新另启动一个线程,但是主线程还在运行,到tt.m2()先获得互斥锁,睡眠2.5秒,修改b=2000,然后主线程立即执行打印2000,然后t.start()才获得互斥锁,执行b=1000。有没有sleep不是都一样的么?求高手指点?