我注意到以下一段代码:
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/