2014-04-29 80 views
4

这将会是有益的,如果任何人都可以适当地在2点从finalize()方法的javadoc的在Object类中澄清:澄清finalize()方法

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必须保持每一个独特的身份和每个对象有史以来VS其finalize方法被调用的信息。它最终会不会超越它存储的区域?

+1

对于1,我会猜测这意味着同步对线程可见。对于第2步,一旦对象的终结器已经运行,对象消失,因此不需要进一步的记录。 – Erik

+0

1s点是好的。对于我对第二点的评论,请查看我对Ivan的回答的评论。 – RRM

回答

2

'用户可见'同步的意义是什么?

锁定您可以从Java代码中进行连接。

除'user-visible'之外还有其他同步吗?

是的,JVM在内部锁定使用。

JVM必须保持创建的每个对象与它的finalize方法被调用的信息的唯一标识。

对象是否已完成存储在标题中。对象没有全局标识。唯一独一无二的是对象本身的引用。

难道它最终不会超出存储区域吗?

该空间在创建对象时分配。

欲了解更多信息Object resurrection in Java

+0

“对象是否已完成存储在标题中” - 这消除了疑问。谢谢! – RRM

+0

@RRMadhav添加了一个可能有趣的链接。 –

+0

在本网站发现相关的主题,由你回复:) http://stackoverflow.com/questions/21809922/how-is-an-object-marked-as-finalized-in-java-so-该最最终化法-止跌 – RRM

1

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

+0

那么,谁清理了GCd对象的无效信息?它是“终结者”线程还是“引用处理程序”线程? – RRM

+0

@RMadhav JVM检查并在对象添加到最终队列时进行设置。它还检查是否覆盖finalize()。 –

1

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

我认为“用户可见同步”是指可以通过源代码编译器看到的代码分析找到的任何锁或同步代码。 JVM实际上可能会使用其他一些锁并在内部同步原语,这对开发人员来说不一定是一个问题。

JVM必须保持创建的每个对象与它的finalize方法被调用的信息的唯一标识。它最终会不会超越它存储的区域?

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