我有下一个问题。当我的令牌过期时,我尝试刷新它。如果此刷新代码由单线程调用,则可以正常工作,但是如果有两个或多个线程,有时我会陷入死锁。
这是我在Interceptor
中的代码:
private val lock = ReentrantLock()
...
private fun tryRefreshToken(chain: Interceptor.Chain): Boolean {
if (lock.tryLock()) { // refresh token by single thread
try {
tryRefreshToken(chain, credentialsProvider)
} catch (e: TokenRefreshFailedException) {
return false
} finally {
lock.unlock()
}
return true
} else {
// another threads should wait here for token refresh
lock.lock() // here I catch deadlock
return true
}
}
如果此方法返回true
-令牌被刷新,false
-如果令牌刷新失败。
如何解决僵局以及我的错误在哪里?
答案 0 :(得分:0)
要达到您的要求,您必须创建令牌的生产者-消费者... 您必须使用锁定/等待并通知,因此第一个线程将更新令牌,而其他线程将等待,直到更新线程通知它们... oracle link上的示例应用程序。
答案 1 :(得分:0)
我调试并阅读了日志,并找到解决问题的方法:
else {
// another threads should wait here for token refresh
lock.lock() // here I wait for token refresh
lock.unlock() // here I free monitor
return true
}