gpt4 book ai didi

java - 不一致的同步冲突

转载 作者:搜寻专家 更新时间:2023-11-01 01:51:52 26 4
gpt4 key购买 nike

我在以下方法中违反了 return 语句:

protected Token getAccessToken() {  
synchronized (this) {
if (token == null || isExpired(token))
token = createToken();
}

return token; // <-- Inconsistent synchronization of blablabla.token; locked 75% of time
}

是否存在与token 字段相关的任何可见性问题?据我了解,在 synchronized block token 之后应该有它的最新值。

我是不是遗漏了什么或者它是误报?

最佳答案

考虑以下几点:

  • 线程1:进入方法
  • 线程2:进入方法
  • Thread1:进入同步块(synchronized block), token 不为空且未过期
  • Thread1:退出同步块(synchronized block)
  • Thread2:进入同步块(synchronized block), token 不为空但已过期
  • 线程 2:分配新 token
  • 线程 1:返回 token (可能是线程 2 分配的新值,也可能是旧值)
  • Thread2:退出同步块(synchronized block)
  • 线程 2:返回(新) token

如果你想做你正在做的事情,那么 token 可能需要是易变的(但这可能不是一个充分的保证!),或者你应该总是从同步块(synchronized block)中返回值,或者将 token 的值赋给同步块(synchronized block)内的局部变量,并从外部返回该局部变量。

在此期间,这甚至没有考虑其他方法可能对 token 执行的操作。如果另一个(同步或非同步)方法也修改了 token(例如分配 null),那么您的情况可能会更糟,因为您假设 token 不为空(正如您刚刚检查的那样),而实际上它可能是 null 现在

关于java - 不一致的同步冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26513442/

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