PS - Here's a slightly simpler version (showing that reordering monitor exit
and volatile read can lead to deadlock).
Initially:
volatile boolean consumed = true;
Thread 1:
while (true) {
synchronized(this) {
work();
consumed = false;
}
while (!consumed) { /* wait */ }
}
Thread 2:
while (true) {
synchronized(this) {
if (!consumed) {
consumeWork();
consumed = true;
}
}
}
As before, thread 2 is using the volatile flag 'consumed' to signal thread 1
to stop waiting and do some more work. If the read of 'consumed' in thread 1
is moved into the synchronized block, then the program deadlocks.
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:32 EDT