On 01/17/2012 09:52 PM, Knute Johnson wrote:
Let's start over here:
Thread 1
int b = 0;
volatile boolean a = false;
...
...
a = true;
b = 1;
Thread 2
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" means "thread 2 observes from thread 1:".
??(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.
you now. The more I think about this the less sense it makes. Or maybe
it's the less sense I make :-).