3

如果我使用 stop-the-world GC 并在我的方法中做一些事情,我finalize()是否可以假设所有线程都被挂起,我可以做任何我想做的事情,除了 GC 线程之外,没有线程敢与我竞争资源?

4

2 回答 2

4

不,实际上甚至可能有多个终结器线程同时运行。

java 语言规范中,“终结器可以按任何顺序调用,甚至可以同时调用。”

于 2011-07-16T02:08:42.223 回答
2

不,你不能 - 至少据我了解热点实现:

至少这就是它与 mark&sweep gc 一起工作的方式,但我很确定它也与所有其他实现类似:

在扫描阶段之后,每个未标记的最终对象都被添加到一个设置了标记位的工作列表中。

然后后台工作人员处理此列表,并在完成一个 finalize 调用后清除标记位,以便下一次 GC 将其清除。因此,您无法对何时调用 finalize 方法做出任何假设(实际上,由于后台线程可能也已停止,因此您可以确定它不是在 GC 运行时!)。

现在这是 Hotspot 的实现细节,甚至可能在不同的 GC 实现之间有所不同。

于 2011-07-16T02:08:37.710 回答