我遇到了互聯網對以下Java類:與方法調用結合使用的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()只是一個方法調用(不是線程),所以主方法應該繼續執行並獲得結果「b」,因爲方法m2中的值爲2000。
的第二次嘗試,我所做的就是取消註釋出
System.out.println("m2")
在M2 method.Suprisingly
,其結果將是幾乎總是:
m2
2000
b=1000
爲什麼在M2方法添加一條語句,是否會導致tt.b的輸出值發生變化?
對不起,我對這裏關於線程和方法調用之間的區別感到很困惑,希望高手能幫幫忙!
儘量讓'B'揮發性 – 2013-04-06 15:08:13