如果我使用stop-the-world GC并在我的finalize()
方法中做一些事情,我可以假设所有线程都被暂停,我可以做任何我想做的事情,没有线程敢于与我竞争资源GC线程除外?
答案 0 :(得分:4)
不,实际上甚至可能有多个终结器线程同时运行。
从java language spec开始,“可以按任何顺序,甚至同时调用终结器。”
答案 1 :(得分:2)
不,你不能 - 至少就我理解的热点实施而言:
至少它与标记和扫描gc的工作方式有关,但我很确定它与所有其他实现类似:
在扫描阶段之后,每个未标记的最终对象都会添加到工作列表中并设置其标记位。
然后一个后台工作者通过这个列表工作,在完成一个finalize调用之后清除标记位,以便它被下一个GC清除。因此,您不能对WHEN调用finalize方法做任何假设(实际上因为后台线程可能也已停止,所以您可以非常确定它不是在GC运行时!)。
现在这是Hotspot的一个实现细节,甚至可能在不同的GC实现之间有所不同。