gpt4 book ai didi

java - 自释放(引用计数)单例

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:43 27 4
gpt4 key购买 nike

考虑以下场景:您有一个代表某种数据提供者的单例类。这个单例类分配了大量内存,你希望它在没有人使用他时释放它分配的内存。流程:

  1. A类调用getInstance并使用单例(这是第一次调用getInstance,单例类分配了巨大的内存块)
  2. B类调用getInstance并使用单例
  3. A 类和 B 类“消亡”(现在没有人使用单例)
  4. 程序还在运行,但是单例的内存没有释放。

您如何建议实现在第 3 阶段(A 类和 B 类“死亡”)将释放内存的单例(我知道 java 使用垃圾收集但仍然可以说我想要以下内存 = null)。

附言我不想强制每个使用单例调用的类在它停止使用时在单例上释放它。我希望单例自己处理“释放”内存。

最佳答案

你能做的是

  • 仅在第一次被请求时创建单例。
  • 将其存储在 WeakReference 中。如果它在其他地方仍然有“强”引用,它只会在 GC 之后保持 Activity 状态。

如果 WeakReference.get()null 这意味着它被收集是因为没有人强烈使用它,另一个弱引用不算数。如果再次需要它,您需要重新创建它和 WeakReference

像这样,

public enum SingletonHolder{; // no instances

private static WeakReference<MyType> ref = null;

public static synchronized MyType getInstance() {
MyType type = ref == null ? null : ref.get();
if (type == null)
ref = new WeakReference<MyType>(type = new MyType());
return type;
}
}

顺便说一句,这假设需要这个实例的实例保留了对它的引用。这就是弱引用“知道”仍然需要它的方式。

顺便说一句,如果它是单线程的,则不需要同步,但它应该是无害的。

这意味着您应该仅在新实例第一次需要它时调用此方法,而不是每次都调用它,并且使其性能更高应该不会有太大区别,例如仔细检查只会使事情复杂化。

关于java - 自释放(引用计数)单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676694/

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