【问题标题】:Synchronization on instance level in JavaJava中实例级别的同步
【发布时间】:2016-12-13 18:52:43
【问题描述】:

我注意到以下一段代码:

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

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

【问题讨论】:

标签: java multithreading


【解决方案1】:

我注意到下面一段代码...是不是没有意义?

当然很大程度上取决于上下文,但从表面上看,代码做了非常具体和有用的事情。所以(呃)我猜是点满了。

代码确保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块的需要,但是代码的效果是一样的。我也可能会争辩说代码应该返回某种错误代码而不是抛出,但这是一个特定于实现的细节。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这不是没有意义的。

    同步意味着在任何时间点只有一个线程可以执行该代码。其他人会等待。

    所以一开始执行的是“假”。第一个线程到达该代码并使其成为真的。

    第二个线程正在等待...

    当第二个线程到达该代码执行为“真”并且第二个线程抛出异常时。

    【讨论】:

    • 你确定...?
    • 嗯。我可能比我应该更快地阅读了这个答案和那个问题。
    • 没问题... :-) 只是假设执行的是多个线程同时使用的单例对象的静态或实例变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多