Hi Chris,
Would it be possible to track the "needsFence" flag throughout the whole
object graph deserialization, and only issue one single fence for the
whole object graph? This would minimize the number of fences issued.
Peter
On 02/19/2015 05:32 PM, Chris Hegarty wrote:
Additional note ( forgotten from original mail):
The fence is needed for "final-freeze" is a one-off barrier at the end of
deserialization, similar that of constructors . Under normal circumstances the object being
deserialized is not visible until deserialization completes, so you don't need a "freeze"
until deserialization completes.
-Chris.
On 19 Feb 2015, at 16:25, Chris Hegarty <chris.hega...@oracle.com> wrote:
A number of years ago there was a proposal to use Unsafe.put*Volatile methods
to set final fields during default deserialisation [1][2], but it never made it
due to concerns about the potential negative impact of the additional fences.
Now we have a, private, fences API in the platform, I think it is time to
revisit this.
Webrev:
http://cr.openjdk.java.net/~chegar/deserialFence/webrev.00/webrev/
Note:
- Section 17.5.3 in the JLS [3], “Freezes of a final field occur both
at the end of the constructor in which the final field is set, and
immediately after each modification of a final field via reflection
or other special mechanism.” I believe this is a consequence of
the way in which setting of final fields is supported in the public
API, Field.setAccessible(), ( as defined by JSR 133 ) and should
not restrict an implementation from using a more performant
means, as is suggested here. The statement in the JLS should
be revisited.
- Default Serialization already has a dependency on Unsafe, and
I don’t see this additional dependency as making that any worse.
- Open question, should we include volatile fields as well as final?
- The changes in the webrev will issue a fence even if custom
deserialization is performed. I think this is ok, as it will be more
consuming to try to determine if a custom readObject set a final
through reflection, or not.
-Chris.
[1] https://bugs.openjdk.java.net/browse/JDK-6647361
[2]
http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-November/005292.html
http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-December/005456.html
[3] http://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5.3