同步方法和信号量的语义等价(1,真)?

kno*_*orv 2 java concurrency multithreading jvm semaphore

以下两个方法定义在语义上是等价的吗?为什么?为什么不?

版本A:

private static synchronized void foo() {
    bar();
}
Run Code Online (Sandbox Code Playgroud)

版本B:

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

JB *_*zet 5

是的,除了

  • 第一个在类上同步,并且代码的其他部分可能在同一个类上同步.
  • 信号量可能是公平的,而同步则不是
  • semaphore.acquire中阻塞的线程可能被中断,导致抛出InterruptedException.您的代码不能按原样编译:您必须以某种方式处理此异常,而您不必使用synchronized.