Мой вопрос - это расширение для этого: Неустойчивые гарантии и исполнение вне порядка
Чтобы сделать его более конкретным, скажем, у нас есть простой класс, который может быть в двух состояниях после его инициализации:
class A {
private /*volatile?*/ boolean state;
private volatile boolean initialized = false;
boolean getState(){
if (!initialized){
throw new IllegalStateException();
}
return state;
}
void setState(boolean newState){
state = newState;
initialized = true;
}
}
Инициализированное поле объявляется volatile, поэтому оно вводит "барьер", предшествующий "преждевременному", который гарантирует, что переупорядочение не может иметь место. Так как поле состояния записано только до, но и инициализированное поле записывается и читается только после, считывается инициализированное поле, я могу удалить ключевое слово volatile декларации государства и до сих пор не видят устаревшего значения. Вопросы:
- Правильно ли это рассуждение?
- Гарантировано ли, что запись в инициализированное поле не будет оптимизирована (поскольку она изменяется только в первый раз), а "барьер" не будет потерян?
-
Предположим, что вместо флага в качестве инициализатора был использован CountDownLatch:
class A { private /*volatile?*/ boolean state; private final CountDownLatch initialized = new CountDownLatch(1); boolean getState() throws InterruptedException { initialized.await(); return state; } void setState(boolean newState){ state = newState; initialized.countdown(); } }
Будет ли все в порядке?