从 java 9 开始,我们终于有了Cleaner. 但是在文档中特别声明:
每个清洁器独立运行,管理待处理的清洁操作并在清洁器不再使用时处理线程和终止。
注册一个对象引用和相应的清理操作会返回一个 Cleanable。最有效的用法是在对象关闭或不再需要时显式调用 clean 方法。
清理操作是一个 Runnable,当对象变为幻像可达时最多调用一次,除非它已经被显式清理。
请注意,清理操作不得引用正在注册的对象。如果是这样,该对象将不会变为幻影可达,并且不会自动调用清理操作。
不幸的是,这正是我所需要的:我要注册的操作需要引用对象本身(通常它只是调用一个方法)。
由于 Cleaner 看起来不可能做到这一点,有没有办法使用 Phantom 或弱/软引用来做到这一点?
我看了看它们,它们看起来相当复杂,所以在投入大量时间认真研究它们之前,我想提前知道这样的事情是否可能
Ps:显然,幻影引用现在似乎在事后执行