【问题标题】:Using finalize as exclusive lock使用 finalize 作为排他锁
【发布时间】:2011-07-16 01:58:57
【问题描述】:

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

【问题讨论】:

  • “没有线程敢于竞争” - 我可以想象可怜的小应用程序线程在角落里颤抖,等待大而卑鄙的旧 GC 线程完成:- )

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多