Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>consider this program:</p> <pre><code>volatile int state; Integer result; void succeed(Integer result) if(state==PENDING) vr0 this.result = result; w1 state = DONE; vw1 Integer peekResult() if(state==DONE) vr2 return result; r2 return null; </code></pre> <p>If volatile read <code>vr2</code> sees <code>DONE</code>, it means it happens after volatile write <code>vw1</code>. So we have happens-before relationships: <code>w1 -&gt; vw1 -&gt; vr2 -&gt; r2</code>. Therefore write <code>w1</code> is visible to read <code>r2</code>.</p> <p>However <code>succeed()</code> isn't thread safe, since <code>vr0</code> and <code>vw1</code> are not atomic. If we use CAS</p> <pre><code>void succeed(Integer result) if( compareAndSet(state, PENDING, DONE) ) vr0+vw0 this.result = result; w1 </code></pre> <p>it fixes the atomicity issue. However, now <code>w1</code> isn't necessarily visible to <code>r2</code>. The memory barrier effect of CAS is kind of like</p> <pre><code>void succeed(Integer result) if(state==PENDING) vr0 state=DONE; vw0 this.result = result; w1 </code></pre> <p>We have here <code>vw0 -&gt; vr2 -&gt; r2</code>, but <code>w1</code> is not on the chain, there is no <code>w1 -&gt; r2</code></p> <p>We must do the volatile write <code>state=DONE</code> after <code>w1</code> to establish the happens-before chain.</p> <pre><code>void succeed(Integer result) if(state==PENDING) vr0 state=TMP; vw0 this.result = result; w1 state=DONE; vw1 </code></pre> <p>or in CAS</p> <pre><code>void succeed(Integer result) if( compareAndSet(state, PENDING, TMP) ) vr0+vw0 this.result = result; w1 state=DONE; vw1 </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload