Frank Peters wrote:
> The specific example I'm thinking of is the one of Figure 6 (p15).
For those of you who don't have the JSR at hand, this is:
Initially, x == y == 0
r1 = x;
if (r1 == 1)
y = 1;
r2 = y;
if (r2 == 1)
x = 1;
> Specifically, I can't see why it's illegal for me to put, say, the
> thread 2 write (x = 1) in my first round of commits (C1), then put the
> corresponding read (r1 = x) in C2, where it sees 0 and then sees the
> value 1 in E3.
> In other words, how do the rules differentiate between the case where
> the conditionals don't exist (and where I presume I would be allowed
> to commit the writes early), and this case, where the conditionals do
In order to commit writes early, those writes must occur in an execution
whose reads only see writes that happen-before them. In this case, the
only writes that happen-before the reads are the writes of 0 to x and y.
The writes of 1 to x and y will not occur in such an execution, so
they cannot be committed early.
This is a bit of an oversimplification, but it should be enough to
jump-start your intuition. It stems from Rule 4 of the formalism.
> I'm sure it's glaringly obvious, so I hope it's no great trouble for
> someone to enlighten me!
Don't worry - it isn't glaringly obvious! This is fairly confusing
stuff. The last time I gave a talk on this, a very well-known computer
scientist didn't understand this exact example.
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:01:09 EDT