我正在对一个不属于我的Java产品进行代码审查。我不是Java专家,但我强烈怀疑这是毫无意义的,并表明了对同步工作方式的根本误解。
synchronized (this) {
this.notify();
}
但我可能错了,因为Java不是我的主要游乐场。也许这样做是有原因的。如果你能告诉我开发人员在想什么,我将不胜感激。
发布于 2011-09-30 16:05:13
这当然不是没有意义的,您可以使用另一个线程,该线程引用了包含上述代码的对象
synchronized(foo) {
foo.wait();
}
以便在发生事情时被唤醒。不过,在许多情况下,在内部/私有锁对象而不是this
上进行同步被认为是一种好的实践。
然而,仅在同步块中执行.notify()可能是非常错误的-您通常有一些工作要做,并在完成时通知它,在正常情况下,这也需要在其他线程中自动完成。我们将不得不看到更多的代码来确定它是否真的是错误的。
发布于 2011-09-30 16:07:56
如果这就是同步块中的全部内容,那么它就是一个反模式,同步点是在块中做一些事情,设置一些条件,然后调用notify
或notifyAll
来唤醒一个或多个等待的线程。
使用wait和notify时,必须使用条件变量,请参见this Oracle tutorial
注意:始终在测试被等待条件的循环内调用wait。不要假设中断是针对您正在等待的特定条件,或者该条件仍然为真。
您不应该仅仅因为线程从对Object#wait的调用中退出就假定您收到了通知,原因有很多:
因此,通知本身还不够好,当等待/通知API没有为您提供足够的信息来了解发生了什么时,您最终会猜测通知是否发生了。即使通知线程正在做的其他工作不需要同步,更新条件变量也需要同步;至少应该更新synchronized块中的共享条件变量。
发布于 2011-09-30 16:07:38
这是非常好的。根据Java 6 Object#notify()
api documentation的说法
此方法只能由此对象监视器的所有者线程调用。
https://stackoverflow.com/questions/7613027
复制相似问题