【问题标题】:Semantic equivalence of synchronized method and Semaphore(1, true)?同步方法和 Semaphore(1, true) 的语义等价?
【发布时间】:2011-10-03 21:29:18
【问题描述】:

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

版本 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();
    }
}

【问题讨论】:

    标签: java multithreading concurrency jvm semaphore


    【解决方案1】:

    是的,除了

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

    【讨论】:

    • 此外,信号量可以从另一个线程释放,而不是从获取它的线程释放。 (见Semaphorejavadocs)
    【解决方案2】:

    我会说 - Java synchronized 块不能保证保持顺序,即它不公平。

    new Semaphore(1, true) 是公平的(true 参数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多