我注意到以下一段代码:

   synchronized (this) {
      if (executed) throw new IllegalStateException("Already executed.");
      executed = true;


这没有意义吗?毕竟,它是同步的,那么为什么它是if (executed) throw new IllegalStateException("Already executed.");

最佳答案

我注意到下面的一段代码……没有意义吗?


当然,这很大程度上取决于上下文,但是从表面上看,代码可以完成非常具体且有用的事情。所以(嗯)我猜是满满的。

该代码确保synchronized块下面的代码仅执行一次。显然,这是在多线程应用程序中。您可能会争辩说,您当然需要的只是一个AtomicBoolean

private final AtomicBoolean executed = new AtomicBoolean();
...
// make sure that this is only executed once
if (!executed.compareAndSet(false, true)) {
    throw new IllegalStateException("Already executed.");
}


上面的代码消除了对synchronized块的需要,但是代码的效果是相同的。我可能还会争辩说,该代码应返回某种错误代码而不是抛出错误,但这是实现特定的细节。

希望这可以帮助。

关于java - Java中实例级别的同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41128501/

10-14 08:05