# HG changeset patch # User martin # Date 1515014255 28800 # Wed Jan 03 13:17:35 2018 -0800 # Node ID 26eab9c117ec6fb45aba2a657c6ec5c9bbbfdfef # Parent 58e023482cd8440afa0e74a6c86d1b035940734e 8145371: ClassCastException thrown in LambdaFormEditor.getInCache Reviewed-by: mhaupt diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandle.java b/src/java.base/share/classes/java/lang/invoke/MethodHandle.java --- a/src/java.base/share/classes/java/lang/invoke/MethodHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandle.java @@ -1660,13 +1660,13 @@ assert(newForm.customized == null || newForm.customized == this); if (form == newForm) return; newForm.prepare(); // as in MethodHandle. - UNSAFE.putObject(this, FORM_OFFSET, newForm); - UNSAFE.fullFence(); + UNSAFE.putObjectVolatile(this, FORM_OFFSET, newForm); } /** Craft a LambdaForm customized for this particular MethodHandle */ /*non-public*/ void customize() { + final LambdaForm form = this.form; if (form.customized == null) { LambdaForm newForm = form.customize(this); updateForm(newForm); diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java --- a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -909,7 +909,7 @@ int c = count; maybeCustomizeTarget(); if (c <= 1) { - // Try to limit number of updates. MethodHandle.updateForm() doesn't guarantee LF update visibility. + // Try to limit number of updates. if (isCounting) { isCounting = false; return true;