diff --git a/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/CrossLoaderAccess.java b/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/CrossLoaderAccess.java index a1a4c0e8..ec7fd7a9 100644 --- a/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/CrossLoaderAccess.java +++ b/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/CrossLoaderAccess.java @@ -109,24 +109,29 @@ private static Class accessClassIn(MethodHandles.Lookup lookup) throws IOExce try { return Class.forName(pkg.getName() + "." + CLASS_NAME, true, lookup.lookupClass().getClassLoader()); } catch (ClassNotFoundException ign) { } - String fqcn = pkg.getName() - .replace('.', '/') - + "/" + CLASS_NAME; - ByteArrayOutputStream classBytes = new ByteArrayOutputStream(HEADER.length + FOOTER.length + fqcn.length() + 16); - DataOutputStream dataOut = new DataOutputStream(classBytes); - for (int b : HEADER) { - dataOut.writeByte(b); - } - dataOut.writeUTF(fqcn); - for (int b : FOOTER) { - dataOut.writeByte(b); - } - try { - return (Class) DEFINE_CLASS.invokeExact(lookup, classBytes.toByteArray()); - } catch (RuntimeException | Error | IOException | ReflectiveOperationException e) { - throw e; - } catch (Throwable e) { - throw new RuntimeException(e); + synchronized(CrossLoaderAccess.class) { + try { + return Class.forName(pkg.getName() + "." + CLASS_NAME, true, lookup.lookupClass().getClassLoader()); + } catch (ClassNotFoundException ign) { } + String fqcn = pkg.getName() + .replace('.', '/') + + "/" + CLASS_NAME; + ByteArrayOutputStream classBytes = new ByteArrayOutputStream(HEADER.length + FOOTER.length + fqcn.length() + 16); + DataOutputStream dataOut = new DataOutputStream(classBytes); + for (int b : HEADER) { + dataOut.writeByte(b); + } + dataOut.writeUTF(fqcn); + for (int b : FOOTER) { + dataOut.writeByte(b); + } + try { + return (Class) DEFINE_CLASS.invokeExact(lookup, classBytes.toByteArray()); + } catch (RuntimeException | Error | IOException | ReflectiveOperationException e) { + throw e; + } catch (Throwable e) { + throw new RuntimeException(e); + } } } }