gpt4 book ai didi

java - 在运行时替换 Java 对象

转载 作者:行者123 更新时间:2023-11-30 11:26:21 26 4
gpt4 key购买 nike

下面的类是在 init() 上初始化的servlet 的方法。 objA仅用于阅读,refreshA - 需要定期调用方法以将其替换为 A 的新实例.

问题: 定期更新后,出现内存泄漏。 (我猜有 some dangling references 现有 A 的多个副本)

public Class A {

private static volatile A objA;

public static A getA(){

if(objA == null){

synchronized (A.class){

if(objA == null){
objA = new A(); //takes a long time to initialise and memory heavy
return objA;
}

}
}
return objA;
}

public static void refreshA (A newObjA){
// best way to do this ?
/*
objA = newObjA;
*/
}
}

有点古怪:

我可以用 ConcurrentHashMap<String,A> -> get("OBJ-A"), replace("OBJ-A", newObjA)

这将使用 ReentrantReadWriteLock 但我还没有尝试过。

那么实现refreshA()的最佳方式是什么? ?请记住,GC 应该删除旧引用。

最佳答案

首先不推荐double-checked locking,请参阅 en.wikipedia.org/wiki/Double-checked_locking。

至于可替换字段,您可以使用 AtomicReference。

关于内存泄漏,考虑给实际对象一个代理。通过这种方式,您可以换出支持实例并确保没有人保留对旧支持对象的引用。

关于java - 在运行时替换 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19835048/

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