У меня следующая проблема.Когда срок действия моего токена истек, я пытаюсь его обновить.Если этот код обновления вызывается однопоточным, он работает нормально, но если есть два или более потоков, иногда я зацикливаюсь.
Это мой код в 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
- если обновление токена не удалось.
Как исправить тупик и где моя ошибка?