拦截器中ReentrantLock上的死锁

时间:2018-09-24 09:34:26

标签: android kotlin deadlock interceptor reentrantlock

我有下一个问题。当我的令牌过期时,我尝试刷新它。如果此刷新代码由单线程调用,则可以正常工作,但是如果有两个或多个线程,有时我会陷入死锁。

这是我在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-如果令牌刷新失败。

如何解决僵局以及我的错误在哪里?

2 个答案:

答案 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
    }