< prev index next >

src/java.base/share/classes/java/lang/invoke/LambdaForm.java

Print this page
rev 13064 : 8142334: Improve lazy initialization of java.lang.invoke
Reviewed-by: psandoz, vlivanov, mhaupt

@@ -1022,11 +1022,11 @@
         return true;
     }
 
     static class NamedFunction {
         final MemberName member;
-        @Stable MethodHandle resolvedHandle;
+        private @Stable MethodHandle resolvedHandle;
         @Stable MethodHandle invoker;
 
         NamedFunction(MethodHandle resolvedHandle) {
             this(resolvedHandle.internalMemberName(), resolvedHandle);
         }

@@ -1072,13 +1072,15 @@
         MethodHandle resolvedHandle() {
             if (resolvedHandle == null)  resolve();
             return resolvedHandle;
         }
 
-        void resolve() {
+        synchronized void resolve() {
+            if (resolvedHandle == null) {
             resolvedHandle = DirectMethodHandle.make(member);
         }
+        }
 
         @Override
         public boolean equals(Object other) {
             if (this == other) return true;
             if (other == null) return false;

@@ -1233,10 +1235,11 @@
                 traceInterpreter("[ call", this, arguments);
                 if (invoker == null) {
                     traceInterpreter("| getInvoker", this);
                     invoker();
                 }
+                // resolvedHandle might be uninitialized, ok for tracing
                 if (resolvedHandle == null) {
                     traceInterpreter("| resolve", this);
                     resolvedHandle();
                 }
                 assert(checkArgumentTypes(arguments, methodType()));
< prev index next >