Java 9 Cleaner正确用法

M. *_* S. 7 java resources garbage-collection

阅读Java 9的Cleaner类后,我在同一页中找到了以下示例:

public class CleaningExample implements AutoCloseable {
    // A cleaner, preferably one shared within a library
    private static final Cleaner cleaner = <cleaner>;

    static class State implements Runnable {

        State(...) {
            // initialize State needed for cleaning action
        }

        public void run() {
            // cleanup action accessing State, executed at most once
        }
    }

    private final State;
    private final Cleaner.Cleanable cleanable

    public CleaningExample() {
        this.state = new State(...);
        this.cleanable = cleaner.register(this, state);
    }

    public void close() {
        cleanable.clean();
    }
}
Run Code Online (Sandbox Code Playgroud)

在第二行中有一条评论说:

清洁工,最好是在图书馆内共享的清洁工

为什么最好Cleaner在一个库中共享一个(静态)?

有没有人有一个很好的例子说明如何使用Cleaner而不是覆盖finalize()

the*_*472 5

为什么最好在库中有一个共享的Cleaner(静态)?

清洁器具有关联的线程。线程是有限的本地资源。因此,目标是通过不创建多余的清理器来限制创建的线程数量。

有没有人有一个很好的例子说明如何使用Cleaner而不是覆盖finalize()?

您发布了参考示例。如果这还不够,您需要提出更具体的问题。

  • @MS 还有更多。请注意,`CleaningExample` 实现了 `AutoCloseable`,因此可以在 `try(...)` 语句中使用。如果你使用它,清理会在块的末尾立即完成,垃圾收集器变得无关紧要。这与不能取消的“finalize()”不同,因此在使用“finalize()”时,您必须接受对象需要收集两次的事实,一次在“finalize()”之前,一次又一次之后,即使无事可做,当使用资源的代码确实调用了 `close()` 时。 (2认同)