--- old/src/share/classes/java/lang/invoke/MethodTypeForm.java 2014-05-28 11:09:44.391392587 +0200 +++ new/src/share/classes/java/lang/invoke/MethodTypeForm.java 2014-05-28 11:09:44.215392595 +0200 @@ -91,8 +91,10 @@ return lambdaForms[which]; } - public LambdaForm setCachedLambdaForm(int which, LambdaForm form) { - // Should we perform some sort of CAS, to avoid racy duplication? + synchronized public LambdaForm setCachedLambdaForm(int which, LambdaForm form) { + // Simulate a CAS, to avoid racy duplication of results. + LambdaForm prev = lambdaForms[which]; + if (prev != null) return prev; return lambdaForms[which] = form; } --- old/src/share/classes/java/lang/invoke/MethodHandleImpl.java 2014-05-28 11:09:44.411392586 +0200 +++ new/src/share/classes/java/lang/invoke/MethodHandleImpl.java 2014-05-28 11:09:44.275392592 +0200 @@ -692,8 +692,7 @@ lform = new LambdaForm("guardWithCatch", lambdaType.parameterCount(), names); - basicType.form().setCachedLambdaForm(MethodTypeForm.LF_GWC, lform); - return lform; + return basicType.form().setCachedLambdaForm(MethodTypeForm.LF_GWC, lform); } static --- old/src/share/classes/java/lang/invoke/LambdaForm.java 2014-05-28 11:09:44.475392583 +0200 +++ new/src/share/classes/java/lang/invoke/LambdaForm.java 2014-05-28 11:09:44.319392590 +0200 @@ -607,7 +607,7 @@ assert(m.getName().equals("interpret" + sig.substring(sig.indexOf('_')))); LambdaForm form = new LambdaForm(sig); form.vmentry = m; - mt.form().setCachedLambdaForm(MethodTypeForm.LF_COUNTER, form); + form = mt.form().setCachedLambdaForm(MethodTypeForm.LF_COUNTER, form); // FIXME: get rid of PREPARED_FORMS; use MethodTypeForm cache only forms.put(sig, form); }