gpt4 book ai didi

java - 使静态方法同步与否

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

我有一个网络服务调用来获取授权 token 并将其用于后续的网络服务调用。现在我们之前所做的是,每当我们调用任何 Web 服务时,我们首先创建 token Web 服务,然后调用实际的 Web 服务。

获取token的方法如下图。基本上这段代码所做的是调用网络服务来获取 token 并使用 GSON 解析响应并获取 token 。

public static String getAuthTicket() {
String authTicket = null;
HttpResponse httpResponse = getAuthResponse();
String body;
if (httpResponse.getStatusLine().getStatusCode() == 200) {
try {
body = IOUtils.toString(httpResponse.getEntity().getContent());
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
ResponseTicket responseTicket = gson.fromJson(body, ResponseTicket.class);
authTicket = responseTicket.getTicket();
} catch (UnsupportedOperationException e) {
LOGGER.error("UnsupportedOperationException : ",e);
} catch (IOException e) {
LOGGER.error("IO Exception : ",e);
}
}
return authTicket;
}

这显然导致了性能问题。因此,提供网络服务以获取 token 的一方已使 token 有效期为 30 分钟。

所以在上面的方法中我们想的是将token连同时间一起放入缓存中并检查当前时间-缓存时间是否小于30。如果时间大于30我们将进行服务调用以获取 token 并使用缓存中的时间戳更新 token 。

我唯一担心的是同步,这样我就不会因为竞争条件而得到损坏的 authtoken。

我正在考虑使这个静态方法同步。您认为还有其他更好的方法吗?

最佳答案

答案是:它取决于

当多个线程在同一时间点访问共享数据时,就会出现竞争条件。所以,当你有这样的代码时:

private final Map<X, Y> sharedCache = new HashMap<>();

public static getAuthTicket() {
if (! sharedCache.containsKey...) {
sharedCache.put(...
...

您会遇到竞争条件——两个线程可能同时进入,并同时更新共享 map ;导致各种问题。

当我得到你的代码时 - 你会得到类似的东西:

private static String cachedToken = null;

public static getAuthTicket() {
if (cachedToken == null || isTooOld(cachedToken)) {
cachedToken = getAuthTicketForReal();
}
return cachedToken;
}

您可能希望两个线程并行调用getAuthTicketForReal()

所以,是的,使该方法同步 是一种有效的方法。

哪里:真正的问题是:添加该关键字是否足够?鉴于我的代码 - 答案是肯定的。您只是想避免此缓存由多个线程“并行”设置。

最后:如果您担心在这里使用synchronized 对性能的影响,请忽略它。您正在谈论多秒“基于网络”的操作;所以你绝对不用担心 synchronized 可能有的毫秒开销(组成这个数字 - 关键是:它太小了,在你的操作上下文中无关紧要正在做)。

关于您的评论:当然,使用同步 意味着 JVM 将序列化 对该方法的调用。这意味着当此方法需要 1 分钟返回时 - 对该方法的任何其他调用都将阻塞那 1 分钟。

从这个意义上说;研究以要求在方法级别同步的方式编写此方法可能是一个很好的练习。例如,通过使用可以处理多个线程操作的数据结构。

关于java - 使静态方法同步与否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44647517/

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