2017-02-14 61 views
0

伯爵「這個」 elasped時間下同步的增量方法是:20000經過時間:5001兩個線程調用比預期

我得到這樣的結果,當我鍵入下面的代碼,我有一個具有計數的類變量在「this」的同步塊中增加,爲什麼當我在main中創建一個新的Exercise對象,然後2個線程使用2 anon runnable的調用ex.increment時,它只需要5秒?不應該總共爲10秒,因爲一個線程獲得一個鎖並且它在另一個應該等待的時候工作嗎?我得到同步的想法,但我只是困惑,爲什麼如果我要使練習實現可運行並將其傳遞給Thread()構造函數,它將需要10秒,但不是這樣,請解釋謝謝。

public class Exercise { 
    private int count = 0; 

    public int getCount() { 
     return count; 
    } 

    public void increment() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     synchronized (this) { 
      for (int i = 0; i < 10000; i++) { 
       count++; 
      } 
     } 
    } 
} 

public class App { 
    public static void main(String[] args) { 
     Exercise ex = new Exercise(); 

     Thread t1 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       ex.increment(); 
      } 
     }); 

     Thread t2 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       ex.increment(); 
      } 
     }); 

     long start = System.currentTimeMillis(); 

     t1.start(); 
     t2.start(); 

     try { 
      t1.join(); 
      t2.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     long end = System.currentTimeMillis(); 

     System.out.println("Count is: " + ex.getCount() + " Time elapsed: " + (end - start)); 
    } 
} 
+0

_When_是獲得的鎖嗎?睡覺之前或之後?換句話說,睡眠呼叫是並行執行還是一個接一個地執行? –

+0

等待,所以你說的是方法同時睡5秒,而同步的塊實際上是在5秒之外連續執行的。 – Calyxander

+0

他們有什麼理由等待彼此? –

回答

1

兩個線程幾乎平行睡5秒。

然後一些線程進入同步塊並立即運行循環。然後另一個線程也一樣。

在這裏沒有什麼奇怪的。