OK, now that I think I can live with V4, back to others.
> V6
> // Does a volatile variable guard unrelated fields?
> Initially:
> boolean a = false;
> volatile boolean b = false;
> 
> Thread 1:
> a = true
> b = true
> 
> Thread 2:
> while (!b);
> boolean tmp = a;
> 
> Question: Is it possible that thread 2 gets a value of false in tmp?
I'm still uncomfortable that a read/write of a simple volatile boolean
is required to perform additional unrelated memory synchronization.  
Note however, that people can get the effects of V6 via V5 if, instead
of using a scalar for the "guarding" volatile, they use a reference.
This provides more controllability since reads/writes of simple
scalars would not require full cache refreshes etc, while read/writes
of references/arrays still would.
To minimally twist your V6 example:
  Initially:
  class X { 
    boolean a = false
    volatile Object b = null;
    ...
  }
  Thread 1:
  a = false;
  b = this; // fields of "this" are now visible.
  Thread 2:
  while (b == null);
  boolean tmp = a;
  Question: Is it possible that thread 2 gets a value of false in tmp?
Does this eliminate, or make significantly more difficult, any
of the idioms you had in mind?
(For reference, here's V5)
> V5
> // Does volatile guarantee fresh values for direct contents of 
> referenced object
> // through multiple levels of indirection?
> Initially:
> volatile Node p;
> 
> Thread 1:
> Node tmp1 = new Node();
> Node tmp2 = new Node();
> tmp1.next = tmp2;
> tmp2.x = 1;
> p = tmp1;
> 
> Thread 2:
> int tmp3 = p.next.x;
> 
> Question: Is it possible that thread 2 gets a value of 0 in tmp3?
> 
-Doug
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:25 EDT