Тупик на ReentrantLock в перехватчике - PullRequest
0 голосов
/ 24 сентября 2018

У меня следующая проблема.Когда срок действия моего токена истек, я пытаюсь его обновить.Если этот код обновления вызывается однопоточным, он работает нормально, но если есть два или более потоков, иногда я зацикливаюсь.

Это мой код в 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 голосов
/ 24 сентября 2018

Я отлаживаю и читаю логи и нахожу решение для моей проблемы:

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
    }
0 голосов
/ 24 сентября 2018

Чтобы выполнить ваше требование, вы должны создать Producer-Consumer токена ... Вы должны использовать блокировку / ожидание и уведомление, поэтому первый поток будет обновлять токен, а другой поток будет ждать, пока поток обновления не уведомит их.... пример приложения по этой ссылке oracle .

...