Latest version looks like this:

     public Object clone() {
         try {
             @SuppressWarnings("unchecked")
             CopyOnWriteArrayList<E> clone =
                 (CopyOnWriteArrayList<E>) super.clone();
             clone.resetLock();
+            // Unlike in readObject, here we cannot visibility-piggyback
on the
+            // volatile write in setArray().
+            VarHandle.releaseFence();
             return clone;
         } catch (CloneNotSupportedException e) {
             // this shouldn't happen, since we are Cloneable
             throw new InternalError();
         }
     }

The store we worry about is a hypothetical subsequent racy publication of
the new object, so we put the release fence at the end of the
pseudo-constructor.


On Mon, Jun 18, 2018 at 9:01 PM, David Holmes <david.hol...@oracle.com>
wrote:

> On 19/06/2018 6:01 AM, Doug Lea wrote:
>
> Hang on! A releasing store does the "release" before the store not after
> it. The whole point being if you see the result of the store then you are
> guaranteed to see all previous stores. The above can reorder the lockField
> store with whatever stores come before it.
>
> David
> -----
>
>

Reply via email to