Я иногда использую переменную экземпляра volatile
в случаях, когда у меня есть два потока, которые читают/записывают в него и не хотят, чтобы накладные расходы (или потенциальный риск взаимоблокировки) вынимали блокировку; например, поток таймера, периодически обновляющий идентификатор int, который отображается как получатель в каком-либо классе:
public class MyClass {
private volatile int id;
public MyClass() {
ScheduledExecutorService execService = Executors.newScheduledThreadPool(1);
execService.scheduleAtFixedRate(new Runnable() {
public void run() {
++id;
}
}, 0L, 30L, TimeUnit.SECONDS);
}
public int getId() {
return id;
}
}
Мой вопрос: Учитывая, что JLS только гарантирует, что 32-разрядные чтения будут атомарными, есть ли какая-нибудь точка в когда-либо, используя долговременную летучую? (то есть 64-бит).
Предостережение. Пожалуйста, не отвечайте, говоря, что использование volatile
over synchronized
- это пример предварительной оптимизации; Мне хорошо известно, как и когда использовать synchronized
, но бывают случаи, когда volatile
является предпочтительным. Например, при определении Spring bean для использования в однопоточном приложении я склонен использовать переменные экземпляра volatile
, так как нет гарантии, что контекст Spring инициализирует каждый bean свойства в основной поток.