我的问题是对这个问题的扩展:易失性保证和乱序执行
为了更具体,假设我们有一个简单的类,它在初始化后可以处于两种状态:
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,因此它引入了happens-before 'barrier',以确保不会发生重新排序。由于状态字段仅在写入初始化字段之前 写入并且仅在读取初始化字段后读取,因此我可以从状态声明中删除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(); } }
还会好吗?