每个Java Object都有方法wait()notify()(以及其他变体)。我从来没有使用过这些,我怀疑很多其他人没有使用过。为什么这些是如此基本,以至于每个对象都必须拥有它们,并且拥有它们会对性能产生影响(大概在其中存储了某种状态)?

编辑以强调该问题。如果我有一个包含100,000个元素的List<Double>,则每个Double都有这些方法,因为它是从Object扩展而来的。但是似乎所有这些都不大可能必须了解管理List的线程。

编辑优秀而实用的答案。 @Jon有一个非常好的博客文章,使我的直觉更加具体。我也完全同意@Bob_Cross的意见,即在担心性能问题之前,应先显示性能问题。 (作为成功语言的第n条定律,如果它对性能造成了影响,那么Sun或某人会修复它)。

最佳答案

好吧,这确实意味着每个对象都必须具有与其关联的监视器。同一监视器用于synchronized。如果您同意在任何对象上进行同步的决定,则wait()notify()不会再添加每个对象的状态。 JVM可能会延迟分配实际的监视器(我知道.NET会这样做),但是必须有一些存储空间可以用来说明哪个监视器与对象相关联。诚然,这可能是一个很小的数量(例如3个字节),由于其余对象开销的填充,实际上并不会节省任何内存-您必须查看每个JVM如何处理内存才能说出一定。

请注意,仅拥有额外的方法不会影响性能(除了由于代码明显存在于某处之外,影响很小)。并不是每个对象,甚至每个类型都没有自己的wait()notify()代码副本。根据vtable的工作方式,每种类型可能会为每个继承的方法添加一个额外的vtable条目-但这仍然仅基于每种类型,而不是基于每个对象。与用于实际对象本身的大量存储相比,这基本上会在噪声中丢失。

就我个人而言,我觉得.NET和Java都通过将监视器与每个对象相关联而犯了一个错误-我宁愿拥有显式的同步对象。我在blog post about redesigning java.lang.Object/System.Object上写了更多有关此的内容。

08-18 17:52
查看更多