# Re: Volatile happens before question

From:
Lew <noone@lewscanon.com>
Newsgroups:
comp.lang.java.programmer
Date:
Wed, 18 Jan 2012 00:06:10 -0800
Message-ID:
<jf5uh7\$9vh\$1@news.albasani.net>
On 01/17/2012 09:52 PM, Knute Johnson wrote:

Let's start over here:

int b = 0;
volatile boolean a = false;
...
...
a = true;
b = 1;

int bStore = b;
if (!a) {
System.out.println("The value of b is " + bStore);
}

Will this always print either "The value of b is 0" or nothing.

+++++++++++++++

I'm not even sure what we are discussing any more so I will make a statement
that I don't think can be false.

I'm going to go out on a limb here.

If a is false at the if in thread 2 then b must be 0 in thread 2.

No. Thread 2 could observe the write 'b = 1;' prior to observing the write 'a
= true;'.

??(observes 'a == false') implies (observes 'b = 0')??.
This is clearly true because
'b = 0' /hb/ 'a = false' /hb/ if (!a) true

??(observes 'b = 1') implies (observes 'a = true')??
??(observes 'a = true') implies (observes 'b = 1')??

Neither is true. There is no /hb/ between the two writes. Thread 2 can observe
them in either order.

??(observes 'a == false') implies (!observes 'b = 1')??.

There is no /hb/ between these two writes. Ergo thread 2 could view them in
either order.

In thread 1, b = 0 happens before a = false happens before a = true happens
before b = 1.

Yes, but thread 2 does not have this /hb/ order. There is no inter-thread /hb/
that orders the writes 'a = false;', 'a = true;' and 'b = 1;'. T2 can see 'b
= 1;' prior to either write to 'a'.

In thread 2, bStore = b happens before the test of a. Therefore bStore must be
0 in the print statement if a is false.

No. T2 can observe 'b = 1;' because no promise or prevention applies to writes
that happen after the observed write to 'a'.

And if a is true at the test in thread 2 then b could be either 0 or 1.

Do we disagree on this?

There is no /hb/ among the writes to 'a' and the 'b = 1;' write that T2 can
observe. T2 can see consecutive writes of zero and one to 'b' before it sees
any of the writes to 'a', or it could never see the 'b = 1;' write, or
anything in between.

--
Lew
Honi soit qui mal y pense.