Re: JavaMemoryModel: Question regarding causality

From: Jeremy Manson (
Date: Sat Feb 05 2005 - 20:40:09 EST


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

Thread 1:

r1 = x;
if (r1 == 1)
   y = 1;

Thread 2

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
> exist.

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 -

This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:01:09 EDT