2011-10-03 84 views
2

以下兩個方法定義在語義上是否相同?爲什麼?爲什麼不?同步方法和信號量的語義等價(1,true)?

版本A:

private static synchronized void foo() { 
    bar(); 
} 

版本B:

private static Semaphore available = new Semaphore(1, true); 
private static void foo() { 
    available.acquire(); 
    try { 
     bar(); 
    } 
    finally { 
     available.release(); 
    } 
} 

回答

5

是,除了

  • 的第一個同步的類,並且有可能是其他地方在同一個類上同步的代碼。
  • 信號量可能是公平的,而同步不是
  • semaphore.acquire中阻塞的線程可能被中斷,從而導致引發InterruptedException。您的代碼不會按原樣編譯:您必須以某種方式處理此異常,而您不必使用同步。
+0

此外,信號量可能會從另一個線程釋放,而不是獲取它。 (請參閱[Semaphore](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html)javadocs) –

3

我想說沒有 - Java的​​塊不能保證維持秩序,即它是不公平的。 (true)。