RFR: 8142334: Improve lazy initialization of java.lang.invoke

Claes Redestad claes.redestad at oracle.com
Thu Nov 12 18:50:03 UTC 2015


Paul,

On 2015-11-12 19:34, Claes Redestad wrote:
>>
>> Claes, was it intentional that you call function.resolve() after the 
>> array store? You might need to reverse that and place a 
>> Unsafe.storeFence between them if it is required that the published 
>> and visible function be resolved.
>
> This however was unintentional, and I think you're right that this 
> would ensure visibility:
>
>         function.resolve();
>         UNSAFE.storeFence();
>         FUNCTIONS[idx] = function;
>
> http://cr.openjdk.java.net/~redestad/8142334/webrev.04/
>

turns out the original order might've been necessary at least in 
DirectMethodHandle.java to break a circular dependency:

     at 
java.lang.invoke.DirectMethodHandle.setCachedFunction(java.base at 9.0/DirectMethodHandle.java:659)
     at 
java.lang.invoke.DirectMethodHandle.getConstantFunction(java.base at 9.0/DirectMethodHandle.java:650)
     at 
java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:232)
     at 
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:188)
     at 
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:177)
     at 
java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:84)
     at 
java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:104)
     at 
java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:109)
     at 
java.lang.invoke.LambdaForm$NamedFunction.resolve(java.base at 9.0/LambdaForm.java:1078)
     at 
java.lang.invoke.DirectMethodHandle.setCachedFunction(java.base at 9.0/DirectMethodHandle.java:659)
     at 
java.lang.invoke.DirectMethodHandle.getConstantFunction(java.base at 9.0/DirectMethodHandle.java:650)
     at 
java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:232)
     at 
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:188)
     at 
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:177)
     at 
java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:84)
     at 
java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:104)
     at 
java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:109)
     at 
java.lang.invoke.LambdaForm$NamedFunction.resolve(java.base at 9.0/LambdaForm.java:1078)

Do you think this would work correctly w.r.t visibility:

         FUNCTIONS[idx] = function;
         function.resolve();
         UNSAFE.storeFence();

?

/Claes



More information about the core-libs-dev mailing list