栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在多个Java线程之间共享数据并获取更新的值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在多个Java线程之间共享数据并获取更新的值

您可以将令牌放入AtomicReference中,并使用信号量来暂停线程:

public class TokenWrapper {  private final AtomicReference<Token> tokenRef = new AtomicReference<>(null);  private final Semaphore semaphore = new Semaphore(Integer.MAX_VALUE);  public TokenWrapper() {    Token newToken = // refresh token    tokenRef.set(newToken);  }  public Token getToken() {    Token token = null;    while((token = tokenRef.get()) == null) {      semaphore.acquire();    }    return token;  }  public Token refreshToken(Token oldToken) {    if(tokenRef.compareAndSet(oldToken, null)) {      semaphore.drainPermits();     Token newToken = // refresh token      tokenRef.set(newToken);      semaphore.release(Integer.MAX_VALUE);      return newToken;    } else return getToken();  }}public class RESTService {  private static final TokenWrapper tokenWrapper = new TokenWrapper();  public void run() {    Token token = tokenWrapper.getToken();    Response response = // call service with token    if(response.getStatus == 401) {      tokenWrapper.refreshToken(token);    }  }}

refreshToken()
使用原子
compareAndSet
tokenRef
,以确保只有一个线程将刷新令牌,然后调用
drainPermits()
semaphore
导致其他线程等待,直到令牌被刷新。
getToken()
如果不是
null
,则返回令牌,否则等待
semaphore
-循环完成,因为线程可能必须在
tokenRef
设置为
null
drainPermits()
被调用之间旋转几个周期
semaphore


编辑:修改了的签名,

refreshToken(Token oldToken)
以便传递旧令牌而不是在方法内部读取-
这是为了防止RESTService_A刷新令牌,RESTService_B获取带有旧过期令牌的401,然后
refreshToken
在之后调用RESTService_B的情况RESTService_A的调用
refreshToken
已完成,导致令牌被刷新两次。使用新的签名,RESTService_B将传递旧的过期令牌,因此,
compareAndSet
当旧令牌无法与新令牌匹配时,调用将失败,导致
refreshToken
仅被调用一次。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/410688.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号