Java:不稳定的隐含订单保证
我的问题是这个问题的扩展:不稳定的保证和无序执行
为了使它更具体,假设我们有一个简单的类,它在初始化后可以处于两种状态:
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 关键字,并且仍然永远不会看到过时的值。问题是:
- 这个推理正确吗?
- 是否保证写入初始化字段不会被优化(因为它只是第一次更改)并且“障碍”不会丢失?
-
假设,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(); } }
还没事吗?