У меня следующая проблема. Когда срок действия моего токена истек, я пытаюсь его обновить. Если этот код обновления вызывается однопоточным, он работает нормально, но если есть два или более потоков, иногда я получаю взаимоблокировку.
Это мой код в 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
— если обновление токена не удалось.
Как исправить мой тупик и где моя ошибка?
synchronized
или блок - person Ravindra Kushwaha   schedule 24.09.2018lock.lock()
в первую очередь? - person user6327816   schedule 24.09.2018