diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/LookupProxyKlassNode.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/LookupProxyKlassNode.java index bc319527c2ae..65ab4bd59460 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/LookupProxyKlassNode.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/LookupProxyKlassNode.java @@ -100,14 +100,21 @@ private static Klass lookupOrDefineInBindingsLoader(EspressoForeignProxyGenerato Symbol proxyName = context.getTypes().fromClassGetName(proxyBytes.name); Klass proxyKlass = registry.findLoadedKlass(context.getClassLoadingEnv(), proxyName); - if (proxyKlass == null) { - try { - proxyKlass = registry.defineKlass(context, proxyName, proxyBytes.bytes); - } catch (EspressoClassLoadingException e) { - throw EspressoError.shouldNotReachHere(e); + if (proxyKlass != null) { + return proxyKlass; + } + // double-checked locking on the proxy name + synchronized (proxyName) { + proxyKlass = registry.findLoadedKlass(context.getClassLoadingEnv(), proxyName); + if (proxyKlass == null) { + try { + proxyKlass = registry.defineKlass(context, proxyName, proxyBytes.bytes); + } catch (EspressoClassLoadingException e) { + throw EspressoError.shouldNotReachHere(e); + } } + return proxyKlass; } - return proxyKlass; } private static ObjectKlass fillParents(Object metaObject, InteropLibrary interop, PolyglotTypeMappings mappings, Set parents, EspressoContext context) throws ClassCastException {