[ Forwarded from "Jack, Paul" <pjack@sfaf.org>; who isn't subscribed
via that email address]
Hi,
My apologies if this question isn't relevant to
the list, but I have a question regarding the
existing Java Memory Model spec (chapter 17
of the Java Language Spec).
I read in a JavaWorld article that it's forbidden
for two synchronized blocks to be merged:
sychronized (lock) {
<op1>;
<op2>;
}
synchronized (lock) {
<op3>;
<op4>;
}
Now assuming there's no side-effects, an optimizing
compiler can legally reorder <op1> and <op2>, or
reorder <op3> and <op4>, but it can't, for instance,
put <op3> between <op1> and <op2>. This all makes
sense to me.
My question involves nested sychronized blocks.
According to the JLS (17.9), "Any association between
locks and variables is purely conventional. Locking
*any* lock conceptually flushes *all* variables from a
thread's working memory..."
So given nested locks...
synchronized (lock1) {
synchronized (lock2) {
<op1>;
<op2>;
}
<op3>;
<op4>;
<op5>;
synchronized (lock2) {
<op6>;
<op7>;
}
}
...what reorderings are allowed? It seems that
<op2><op1> <op5><op4><op3> <op7><op6> would
be legal, but not <op4> <op2><op1> <op5>
<op7><op6> <op3>. Am I correct in this assumption,
and if I am, what's the rationale?
Thanks for your time...
-Paul
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:39 EDT