gpt4 book ai didi

java - 当变量在多个类中发生更改时,如何同步对变量的访问?

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

我有一个调度程序类,另一个类是自定义 http 客户端。

调度程序在应用程序启动时初始化,并在后台执行工作,例如每 30 秒查询一次服务 (url) 并将数据写入日志。

http 客户端也是使用该 url 创建的。

URL 可以随时更改,因此我需要确保无论何时日志调度程序和 http 客户端都使用新的 url 重新初始化。

public class LogScheduler {
public log() {
synchronized(globallock) {
String url = getUrl();
//log some activity
}
}
}

我们有另一个调度程序,它每 30 分钟寻找一次新的 url。

public class UrlScheduler {
private volatile String url;
public void check() {
String url = service.getNewUrl();
if(url!=this.url) {
synchronized(globallock) {
this.url=url;
reinitialize http client
}
}
}
public String getUrl(){
return url;
}
}

现在我正在使用全局锁定来确保日志调度程序在 url 调度程序更改该值后立即看到该值。我真的不喜欢使用全局锁的想法,因为它会破坏封装以及其他问题。

如何更改我的设置,以便在 URL 更改后立即重新初始化日志调度程序和 http 客户端,并在按顺序更改时同步它们?如果 url 没有改变,我想避免重新初始化。

如果在发出请求时正在更新 url,那么如何使用 http 客户端阻止 ui 线程。

这是一个 Spring 应用程序。

如果不清楚,请告诉我,我很乐意提供更多详细信息。

最佳答案

由于信息有限,如果有什么不起作用,请告诉我,我会进行更改。

对我来说,最简单的事情是将 HTTPClient 与任何可能需要它的东西分离。解耦客户端意味着您不需要处理专注于其他事情的类中的同步问题(例如记录或 ping 服务)

这是一个图表。 https://i.imgur.com/PWsXx2G.png

看起来你的改变很小。主要区别在于您需要为 HTTPClient 创建一个包装器,这样您就可以在客户端中同步它以确保 HTTPClient 始终是正确的。

示例包装器,不要使用它,因为它非常简单

public class HTTPClientProxy{

private final Object syncLock = new Object();

private HTTPClient client;

public HTTPClient getClient(){
synchronized(syncLock){
return client;
}
}

public void updateClient(URL url){
synchronized(syncLock){
client = new HTTPClient(url);
}
}
}

一个潜在的问题,也是一个我不确定的问题。如果您有多个服务,并且它们都是捆绑程序(例如链接并且需要使用相同的 URL)。然后您需要在这一侧有其他东西,这样您就可以确保它们都使用相同的客户端。然而,这将是一个好的开始,因为它使您不必担心从 HTTPClient 获取错误数据,并将该功能移至代理类中。

关于java - 当变量在多个类中发生更改时,如何同步对变量的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56895290/

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