2013-12-17 95 views
0

爲什麼這封信的答案是b? (下面的問題和答案) 我明白7a 7b 8a 8b,因爲該方法是同步的,因此一次只能執行一個線程,但爲什麼6a 7a 6b 7b也可以接受?第二個線程不應該等待第一個線程完成該方法嗎?兩個線程一個同步方法scjp

public class Lockdown implements Runnable { 
      public static void main(String[] args) { 
      new Thread(new Lockdown()).start(); 
      new Thread(new Lockdown()).start(); 
      } 
      public void run() { locked(Thread.currentThread().getId()); } 
      synchronized void locked(long id) { 
      System.out.print(id + "a "); 
      System.out.print(id + "b "); 
      } 
     } 

b)設置7A 7B圖8a 8b和設置6A 7A 6B 7b是兩個可能的。 (*)

+0

如果這個問題來自互聯網,它可能有錯誤的「正確的」答案... – John

+0

@John這是來自SCJP考試http://education.oracle.com/pls/web_prod-plq-dad/db_pages。 GETPAGE?PAGE_ID = 303&p_certName = SQ1Z0-851 – mel3kings

回答

2

這是正確的,因爲有兩個Lockdown對象和每個線程。例如

Lockdown lockk = new Lockdown(); 
new Thread(lockk).start(); //thread1 
new Thread(lockk).start(); //thread2 

會導致線程等待第一個完成執行。所以結果將永遠是7a 7b 8a 8b,或類似的東西。同步方法使線程僅在線程在同一對象上運行時才能等待。

但是對於在不同對象上運行的線程,它也可能輸出6a 7a 6b 7b。你舉的例子是像

Lockdown lock1 = new Lockdown(); 
Lockdown lock2 = new Lockdown(); 
new Thread(lock1).start(); //thread1 
new Thread(lock2).start(); //thread2 

輸出:

thread1 on lock1 print -> 6a 
thread2 on lock2 print -> 7a 
thread1 on lock1 print -> 6b 
thread2 on lock2 print -> 7b 

但它也可以是:

thread1 on lock1 print -> 6a 
thread1 on lock1 print -> 6b 
thread2 on lock2 print -> 7a 
thread2 on lock2 print -> 7b 

這樣你就可以得到2個不同的結果。

0

您是否嘗試過運行代碼?

我沒有和我得到的結果

9a 9b 10a 10b 

我第二次拿到

9a 10a 10b 9b 

這意味着線程獲取和隨意釋放鎖。在真正發生之前,您無法預測執行順序。

請注意,synchronized關鍵字保證一次只有一個線程訪問代碼塊。

相關問題