gpt4 book ai didi

Java 相当于 GC.SuppressFinalize

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:20 25 4
gpt4 key购买 nike

Java 是否有相当于 .Net 的 GC.SuppressFinalize

在 .Net 中,SuppressFinalize 用于 dispose pattern避免 relatively high performance cost只要对象被显式处置,就可以完成终结。类似的成本也适用于 Java,但它似乎没有 SuppressFinalize。

我知道,通常最好完全避免终结器,但我不认为我可以在我的特定用例中避免它们(取消 token ,您可以添加仅在另一个 token 没有先取消时运行的处理程序,因此 token 由于其源被收集而变得不朽,必须导致条目从链接的 token 中删除,以免它们无限制地累积垃圾条目)。

Java 中是否有相当于 SuppressFinalize 的功能?如果不是,是否可以使用可用的工具进行近似(例如 ReferenceQueue )?

最佳答案

我想出了一个可能的解决方法,因为 Java 中没有类似的方法,可以避免终结器的成本:使用缓存。

  1. 拥有一个带有可更改回调成员的对象:

    public final class Finalizer {
    public Runnable onFinalizer;
    @Override
    protected void finalize() {
    if (onFinalizer != null) {
    onFinalizer.run();
    }
    }
    }
  2. 收集它们:

    Stack<Finalizer> finalizerCache = new Stack<>();
  3. 需要时抓取:

    this.finalizer = finalizerCache.isEmpty() ? new Finalizer() : finalizerCache.pop();
    this.finalizer.onFinalizer = () -> { my special cleanup code; };
  4. 需要时丢弃:

    void cancel() {
    this.finalizer.onFinalizer = null;
    if (finalizerCache.size() < 100) {
    finalizerCache.push(this.finalizer);
    }
    this.finalizer = null;
    }

显然,与缓存大小及其同步方式相关的调整可能有很多,但这应该是一种有用的方法,可以在终结器很少运行并且需要终结的对象总数没有太多变化的情况下避免终结器的成本。

关于Java 相当于 GC.SuppressFinalize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23797944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com