Hello,
I am trying to get a better understanding of what it means for a program 
to be correctly synchronized (as defined in the JSR-133). The JSR states 
that:
"A data race occurs in an execution of a program if there are conflicting 
actions in that execution that are not ordered by synchronization (ie, by 
a happnes-before relationship). A program is correctly synchronized iff 
all sequentially consistent executions are free of data races"
Is the following program correctly synchronized?
      public static boolean w = false;
      public static boolean v = false;
   T1                       T2
w=true;                  while(true) {
synchronized(M) {         synchronized(M) {
 v =true;                  if (v) break;
}                         }
                         }
                         boolean tmp=w;
In any legal execution of that program the following sequence of actions 
will occur: T1 writes to w, T1 releases M, T2 acquires M, T2 reads w. This 
is enforced by the fact that the read of w can only happen after T1 exits 
the loop, which in turn can only happen after T2 modifies v.
For example (arrow describes a happens-before edge):
T1               T2
              ACQ(M)
              READ(v)  // v still false; cannot exit loop
              REL(M)
WRITE(w)
ACQ(M)
WRITE(v)
REL(M) ------->
              ACQ(M)
              READ(v) // exits the loop
              REL(M)
              READ(W)
Acording to the definition above, there is a happens-before relationship 
(by transitivity) between the write to w and the read from w in any 
execution of the program. But is it correctly synchronized?
Best regards
Adam Welc
-- Adam Welc Computer Science Building, room 274 West Lafayette, IN 47906 Telephone number (work): (765) 4947836http://www.cs.purdue.edu/homes/welc
------------------------------- JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:57 EDT