2016-01-24 58 views
-1
class A implements Runnable { 
    static int b = 10; 

    public void run() { 
     m1(); 
    } 

    public synchronized void m1() { 
     b = 100; 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(b); 
    } 

    public synchronized void m2() { 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     b = 200; 
     System.out.println(b + "m2"); 

    } 

    public static void main(String[] args) { 
     A aa = new A(); 
     Thread tt = new Thread(aa); 
     tt.start(); 
     aa.m2(); 
    } 
} 
+1

爲什麼你認爲它應該是100,然後是200(儘管有時可能)? – SMA

+1

它讓我感到這個問題得到了贊成票。 – Raedwald

回答

0

因爲當你在做.start()時,線程將被調度執行。雖然對aa.m2()的調用正在執行,並且會更快(大部分時間)。

0

aa.m2主線程將直接調用m2方法,所以它將是第一個被執行的,因爲tt需要很少的時間來初始化和啓動。 m2方法是同步的,所以它會獲得對象的鎖定aa,那麼當線程tt完成初始化時它會調用m1方法並等待鎖定對象aa被釋放(m1方法也同步)。

+0

非常感謝。我總是混淆線程和它很難理解。 – Whattime

相關問題