Skip to main content
replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link
URL Rewriter Bot
URL Rewriter Bot

My question is an extension to this one: Volatile guarantees and out-of-order executionVolatile guarantees and out-of-order execution

To make it more concrete, let's say we have a simple class which can be in two states after it is initialized:

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; } } 

The field initialized is declared volatile, so it introduces happen-before 'barrier' which ensures that reordering can't take place. Since the state field is written only before initialized field is written and read only after the initialized field is read, I can remove the volatile keyword from declaration of the state and still never see a stale value. Questions are:

  1. Is this reasoning correct?

  2. Is it guaranteed that the write to initialized field won't be optimized away (since it changes only the first time) and the 'barrier' won't be lost?

  3. Suppose, instead of the flag, a CountDownLatch was used as an initializer like this:

    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(); } } 

Would it still be alright?

My question is an extension to this one: Volatile guarantees and out-of-order execution

To make it more concrete, let's say we have a simple class which can be in two states after it is initialized:

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; } } 

The field initialized is declared volatile, so it introduces happen-before 'barrier' which ensures that reordering can't take place. Since the state field is written only before initialized field is written and read only after the initialized field is read, I can remove the volatile keyword from declaration of the state and still never see a stale value. Questions are:

  1. Is this reasoning correct?

  2. Is it guaranteed that the write to initialized field won't be optimized away (since it changes only the first time) and the 'barrier' won't be lost?

  3. Suppose, instead of the flag, a CountDownLatch was used as an initializer like this:

    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(); } } 

Would it still be alright?

My question is an extension to this one: Volatile guarantees and out-of-order execution

To make it more concrete, let's say we have a simple class which can be in two states after it is initialized:

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; } } 

The field initialized is declared volatile, so it introduces happen-before 'barrier' which ensures that reordering can't take place. Since the state field is written only before initialized field is written and read only after the initialized field is read, I can remove the volatile keyword from declaration of the state and still never see a stale value. Questions are:

  1. Is this reasoning correct?

  2. Is it guaranteed that the write to initialized field won't be optimized away (since it changes only the first time) and the 'barrier' won't be lost?

  3. Suppose, instead of the flag, a CountDownLatch was used as an initializer like this:

    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(); } } 

Would it still be alright?

Source Link
Kovalsky
  • 349
  • 1
  • 2
  • 11

Java: volatile implied order guarantees

My question is an extension to this one: Volatile guarantees and out-of-order execution

To make it more concrete, let's say we have a simple class which can be in two states after it is initialized:

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; } } 

The field initialized is declared volatile, so it introduces happen-before 'barrier' which ensures that reordering can't take place. Since the state field is written only before initialized field is written and read only after the initialized field is read, I can remove the volatile keyword from declaration of the state and still never see a stale value. Questions are:

  1. Is this reasoning correct?

  2. Is it guaranteed that the write to initialized field won't be optimized away (since it changes only the first time) and the 'barrier' won't be lost?

  3. Suppose, instead of the flag, a CountDownLatch was used as an initializer like this:

    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(); } } 

Would it still be alright?