同步方法和 Semaphore(1, true) 的语义等价吗?

发布于 2024-12-07 17:55:53 字数 363 浏览 1 评论 0原文

以下两个方法定义在语义上是否等效?为什么?为什么不呢?

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

Are the following two method definitions semantically equivalent? Why? Why not?

Version A:

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

Version B:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

巷雨优美回忆 2024-12-14 17:55:53

是的,除了

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

Yes, except

  • that the first one synchronizes on the class, and that there might be other parts of the code that synchronize on the same class.
  • that the semaphore could be fair, whereas synchronization is not
  • that the thread blocked in semaphore.acquire could be interrupted, causing an InterruptedException to be thrown. Your code doesn't compile as is: you must handle this exception somehow, whereas you don't have to using synchronized.
长伴 2024-12-14 17:55:53

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

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

I would say no - Java synchronized block is not guaranteed to preserve order, i.e. it is not fair.

new Semaphore(1, true) is fair (true argument).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文