Hi Evan,
>
> Doug,
>
> Thanks for the clarification. I have already found the page
> http://www.cs.umd.edu/~pugh/java/memoryModel, in fact that is where I found
> the link to the document I quoted. I presume that by "new version" you are
> referring specifically to
> http://www.cs.umd.edu/~pugh/java/memoryModel/newest.pdf.
I strongly recommend that you look at the community review document:
http://www.cs.umd.edu/~pugh/java/memoryModel/CommunityReview.pdf
This treats informal questions in a much clearer way than the newest.pdf
you looked at.
Having said that, the basic requirement you are after is that:
All writes that happen before a given unlock must be visible to any
actions that happen after a following lock of the same monitor.
So, in your example:
> synchronized (a)
> {
> synchronized (b)
> {
> p.x++;
> }
> }
You incremented p.x both before you unlocked b, and before you unlocked a.
Therefore, that write must be visible after a following lock on a OR b.
Either of these:
>
> synchronized (a)
> {
> // do something with p.x
> }
>
> or:
>
> synchronized (b)
> {
> // do something with p.x
> }
Is fine.
Synchronization operations on different monitors do not establish these
happens before paths. So, in:
Thread 1:
synchronized(a) {
p.x++
}
Thread 2:
synchronized(b) {
r1 = p.x;
}
Even if Thread 1 occurs earlier (in some sense) than Thread 2, Thread 1
does not "happen-before" Thread 2; Thread 2 is not guaranteed to see the
increment.
The way it works is a little different from the intuition you put in your
message. Does this intuition make it a little clearer?
Jeremy
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:51 EDT