2011-10-03 48 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)。