gpt4 book ai didi

java - 如何防止在另一个线程的静态调用上创建对象副本

转载 作者:行者123 更新时间:2023-12-02 01:25:53 25 4
gpt4 key购买 nike

我目前正在修复一个长期项目中的内存问题,并且遇到了一个特别消耗内存的问题。问题是,一个类拥有一个非常大的静态数据结构,并且还有一个静态的remoteSubscriber 类。我们使用 TimerTask 定期在远程位置注册订阅者。

为此,相关字段将传递给计时器,计时器将创建 ConnectionManager 类的完整副本。这包括海量数据结构。

为了防止我们最需要数据的对象两次,我想找到一种使用这些字段的方法,不需要将整个父对象复制到新线程。我想到了 RMI,但是还有其他选择吗?

这是问题的一些伪代码:

public class ConnectionManager{

private static volatile ConnectionManager INSTANCE=new ConnectionManager();
private BigFatStructure bigMama;
private RemoteSubscriber remoteSubscriber;


private ConnectionManager() {

}

public void initConnection() {
//initializes fields
}

private static void connect() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new KeepAliveTask(remoteSubscriber),SOMEVALUE,SOMEVALUE);
try {
registerSubscriber();
} catch (DistributionException e) {
}

}

public static ConnectionManager getInstance() {

if(INSTANCE==null){
synchronized(ConnectionManager.class){
if(INSTANCE==null){
INSTANCE=new ConnectionManager();
}
}
}
return INSTANCE;
}
}

public class KeepAliveTask extends TimerTask {
private RemoteSubscriber remoteSubscriber;

public KeepAliveTask(Subscriber remoteSubscriber){
this.remoteSubscriber=remoteSubscriber;
}

@Override
public void run() {
if (ConnectionManager.getInstance().getRemoteSubscriber() != null) {
try {
try {
IRemoteService service = MyProvider.getService();
service.register(remoteSubscriber);
} catch (Exception e) {
throw new DistributionException(e);
}
} catch (DistributionException e) {
}
}
}
}

防止新线程持有 ConnectionManager 的单独副本的最佳方法是什么?

提前致谢!

编辑:更改了代码和描述以更好地反射(reflect)更新后的状态

最佳答案

您可以使用单例模式来拥有一个唯一的对象。

https://www.javatpoint.com/singleton-design-pattern-in-java

看看 Java 设计模式,它们是解决特定问题/任务的经过充分验证的解决方案。

https://www.javatpoint.com/design-patterns-in-java

关于java - 如何防止在另一个线程的静态调用上创建对象副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56948425/

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