Import miscellaneous maintenance on CopyOnWriteArrayList from Doug Lea's
Doug Lea writes:
"Those of you who had argued that for consistency, CopyOnWriteArrayList
should use use ReentrantLock, not "synchronized" will be pleased
to know that there was finally a reason to do this. A marginal
reason, but just enough to push me over the edge while
revising anyway (*): The efficiency of COWArrayList relies in part
on the ability of optimizers to specially handle the combination
of a volatile write followed by an unlock. It is possible that
in Mustang, new fast-paths for never-contended locks will not
be able to peform this optimization (but still can/will with
j.u.c locks). While the net result may still be faster with builtin
locks in some cases, it won't be in others, so it seems
marginally preferable to use RL to get more predictable performance.
On current Mustang builds (that don't have any of the new
lock stuff in them), performance is about the same with
RL vs synchronized.
The only ugly part of this is that I had to resort to sun.misc.Unsafe
hacks to bind the transient final ReentrantLock during deserialization.
It had to be transient so as to be serialization-compatible with J2SE5.
And the only way to set a transient final during deserialization is
to cheat either using unsafe or setAccessible + reflection. And the
former is a little faster (but only applies if the code is in
bootclasspath), so I did it that way. (No, there has not been any
progress on changing serialization rules in some way that would evade
this, and I don't see any way anything will happen for Mustang.)
(*) The "revising anyway" part is to adapt to use new
array-cloning methods that will be in Mustang."
###@###.### 2005-06-08 03:16:59 GMT