RFR [9]: default Serialization should issue a fence after reconstructing an Object with final fields
Chris Hegarty
chris.hegarty at oracle.com
Mon Feb 23 11:01:57 UTC 2015
Peter, David, Vitaly,
Can you please take a look at the latest version of this change:
http://cr.openjdk.java.net/~chegar/deserialFence/webrev.02/webrev/
On 20/02/15 15:09, Peter Levart wrote:
>...
> This looks good now. But I wonder if issuing fences after nested calls
> to readObject() makes much sense. If cycles are present in a subgraph
> deserialized by nested call to readObject(), a field pointing back to an
> object not part of the subgraph stream will point to the object that
> will not be fully initialized yet, so nested calls to readObject()
> should not be expected to return a reference to a fully constructed
> subgraph anyway. Only top-level call is guaranteed to return a fully
> constructed graph.
Right. I was never convinced of this myself either. Removed. Unnecessary
complication.
> If you optimize this and only issue one fence for top-level call to
> readObject(), tracking of 'requiresFence' (I would call it
> requiresFreeze to be in line with JMM terminology - the fence is just a
'requiresFreeze' is better. Updated
> way to achieve freeze) can also be micro-optimized. You currently do it
> like this:
>
> 1900 requiresFence |= slotDesc.hasFinalField();
>
> which is a shortcut for:
>
> requiresFence = requiresFence | slotDesc.hasFinalField();
>
> ...which means that the field is overwritten multiple times
> unnecessarily and slotDesc.hasFinalField() is called every time. You can
> write the same logic as:
>
> if (!requiresFence && slotDesc.hasFinalField()) {
> requiresFence = true;
> }
... and it is more readable. Updated.
> There will be at most one write to the field and potentially less calls
> to slotDesc.hasFinalField().
-Chris.
More information about the core-libs-dev
mailing list