Должны ли глобальные переменные оставаться изменчивыми, если методы, обращающиеся к ним, синхронизированы / реализуют блокировки? - PullRequest
1 голос
/ 03 апреля 2020

Я пытался узнать больше о безопасности потоков и пытался придумать хорошие практики при реализации потокового кода. В контексте извлечения токена я хочу отслеживать текущее время и время истечения токена (разделенное пополам, поэтому я буду обновлять sh до истечения срока действия токена). Вот некоторый псевдокод о ситуации, о которой я думаю

long renewTime = 0; //should this be a volatile long?
Lock lock = new Lock
Service someService = new Service();

public void authenticateWithSomeService() {
    try {
        lock.get()
        //...call to login with someService
        renewTime = System.currentTimeMillis() + someService.getToken.getExpirationTime/2
    catch (Exception e) {
        //log or rethrow
    } finally {
        lock.unlock();
    }
}

private void refreshToken() {
    if(System.currentTimeMillis() > renewTime) {
        //...call to renew token with someService
        long newTime = someService.getToken.getExpirationTime/2
        renewTime = System.currentTimeMillis() + newTime;
    }
}

public synchronized String getStuff() {
    refreshToken(); //check if token needs to be refreshed
    try {
        //...some HTTP call to get an item with the service
    } catch (Exception e) {
        //log or rethrow
    }
}

Так что при таком сценарии мы гарантируем, что renewTime будет когда-либо читаться / записываться только одним потоком за раз с 1 метод аутентификации использует блокировки и 2. метод getStuff, который читает и пишет renewTime, синхронизируется? Является ли этот потокобезопасным или renewTime должен быть изменчивым, чтобы обеспечить доступ потоков к одному и тому же значению?

...