Java 澄清对象类中finalize()方法

Java 澄清对象类中finalize()方法,java,Java,如果有人能够正确地澄清对象类中finalize()方法的javadoc中的两点,这将是非常有帮助的: 1. It is guaranteed, however, that the thread that invokes finalize will not be holding any user-visible synchronization locks when finalize is invoked. “用户可见”同步的意义是什么?除了“用户可见”之外,还有其他同步吗 2. The fina

如果有人能够正确地澄清对象类中finalize()方法的javadoc中的两点,这将是非常有帮助的:

1. It is guaranteed, however, that the thread that invokes finalize will not be holding any user-visible synchronization locks when finalize is invoked.
“用户可见”同步的意义是什么?除了“用户可见”之外,还有其他同步吗

2. The finalize method is never invoked more than once by a Java virtual machine for any given object.
在这种情况下,JVM必须维护所创建的每个对象的唯一标识,以及调用其finalize方法的信息。它最终会扩展到存储在哪个区域之外吗?

我想(!)第二点是通过调用
finalize()
后删除该对象来实现的。这样就不需要存储

“用户可见”同步的意义是什么

锁定您可以从Java代码进行的访问

除了“用户可见”之外,还有其他同步吗

2. The finalize method is never invoked more than once by a Java virtual machine for any given object.
是的,JVM内部有锁供其使用

JVM必须维护曾经创建的每个对象的唯一标识,以及它的finalize方法被调用的信息


对象是否已完成将存储在标题中。对象没有全局id。它唯一的独特之处就是对对象本身的引用

它最终不是会超越它所储存的任何区域吗

创建对象时会分配此空间

更多信息

“用户可见”同步的意义是什么?除了“用户可见”之外,还有其他同步吗

2. The finalize method is never invoked more than once by a Java virtual machine for any given object.
我认为“用户可见同步”是指通过分析源编译器看到的代码可以找到的任何锁或同步代码。JVM实际上可能会在内部使用许多其他锁和同步原语,这对开发人员来说不一定是个问题

JVM必须维护曾经创建的每个对象的唯一标识,以及它的finalize方法被调用的信息。它最终不是会超越它所储存的任何区域吗


否-这是因为一旦JVM调用
finalize()
-最终对象将被gc'd。

关于1,我猜测这意味着线程可以看到同步。至于nr 2,一旦对象的finalizer已经运行,该对象将消失,因此不需要进一步记账。1s点很好。关于我对第二点的评论,请查看我对Ivan回答的评论。那么,谁来清理GCd对象的无效信息呢?是“Finalizer”线程还是“Reference Handler”线程?@RRMadhav JVM会检查这一点,并在将对象添加到终结队列时进行设置。它还检查是否覆盖了finalize()。“对象是否已定稿存储在标题中”-这消除了疑问。谢谢@RRMadhav添加了一个可能很有趣的链接。在该网站上找到了一个相关的线程,您也回答了:)