Is SharedSecrets thread-safe?
Claes Redestad
claes.redestad at oracle.com
Tue Dec 29 14:55:22 UTC 2020
All the shared secrets are injected as a side effect of loading the
class the getter ensures is initialized - which should provide the
necessary constraints to ensure there is no way for a reordering to
happen where the access object returned can be observed to be null.
E.g.
if (javaSecuritySignatureAccess == null) {
ensureClassInitialized(Signature.class);
}
return javaSecuritySignatureAccess;
Signature.java:
static {
SharedSecrets.setJavaSecuritySignatureAccess(...);
}
/Claes
On 2020-12-29 14:55, Johannes Kuhn wrote:
> Depends on what `initialize()` is.
>
> If it (at least) reads a volatile field, then the compiler can't reorder
> the second read before the first.
>
> - Johannes
>
> On 29-Dec-20 14:42, some-java-user-99206970363698485155 at vodafonemail.de
> wrote:
>> Hello,
>> the class `jdk.internal.access.SharedSecrets` provides getter methods
>> which all look similar to this:
>> ```
>> if (static_field == null) {
>> initialize();
>> }
>> return static_field;
>> ```
>>
>> However, neither the static fields are `volatile` nor are the getter
>> methods synchronized. So if my
>> understanding of the Java Memory Model is correct, the compiler is
>> free to reorder the two static
>> field reads. So it is in theory possible that the first read yields a
>> non-`null` value, but the
>> second read yields a `null` value which leads to incorrect behavior
>> (for further reading [1]).
>>
>> It is probably rather unlikely that this actually happens because
>> `SharedSecrets` is in most cases
>> accessed from static initializers (which are only run once) and
>> because not many classes access the
>> same `SharedSecrets` fields.
>>
>> Is this analysis correct or did I forget to consider parts of the
>> Memory Model logic, or is there
>> some JVM magic I am missing?
>>
>> Kind regards
>>
>> [1]
>> https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/#wishful-benign-is-resilient
>>
>>
More information about the core-libs-dev
mailing list