Я пытался узнать больше о безопасности потоков и пытался придумать хорошие практики при реализации потокового кода. В контексте извлечения токена я хочу отслеживать текущее время и время истечения токена (разделенное пополам, поэтому я буду обновлять 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
должен быть изменчивым, чтобы обеспечить доступ потоков к одному и тому же значению?