使用finalize作为独占锁

时间:2011-07-16 01:58:58

标签: java multithreading concurrency garbage-collection mark-and-sweep

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

2 个答案:

答案 0 :(得分:4)

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

java language spec开始,“可以按任何顺序,甚至同时调用终结器。”

答案 1 :(得分:2)

不,你不能 - 至少就我理解的热点实施而言:

至少它与标记和扫描gc的工作方式有关,但我很确定它与所有其他实现类似:

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

然后一个后台工作者通过这个列表工作,在完成一个finalize调用之后清除标记位,以便它被下一个GC清除。因此,您不能对WHEN调用finalize方法做任何假设(实际上因为后台线程可能也已停止,所以您可以非常确定它不是在GC运行时!)。

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