2016-12-13 73 views
0

实例级别我注意到下面的一段代码:同步在Java中

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

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

+1

'execution'的范围和生命周期是什么?这是这里的重要信息。 – NPE

+0

http://stackoverflow.com/questions/13356702/how-can-i-make-sure-a-method-is-only-called-once-by-multiple-threads –

回答

1

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

取决于上下文,但在面值上,代码做了一个非常特定和有用的事情。所以(呃)我猜是满分。

该代码可确保​​块以下的代码仅执行一次。这显然是在一个多线程应用程序中。你可以说,所有你需要的,这是当然的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."); 
} 

上面的代码删除了​​块的需要,但代码的效果是一样的。我也可能会争辩说,代码应该返回某种错误代码而不是抛出,但这是一个实现特定的细节。

希望这会有所帮助。

0

这并非毫无意义。

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

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

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

当第二个线程到达该代码执行的是“真”及第二线程抛出异常。

+0

你确定...? – Vadim

+0

嗯。我可能已经阅读了这个答案,这个问题比我应该更快一点。 – Makoto

+0

没问题...... :-)假设执行是同时由多个线程使用的单例对象的静态或实例变量。 – Vadim