diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java b/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java index 31de82a6e..9112515e3 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java @@ -70,10 +70,19 @@ public final class DataValueBytesMarshallers { public static Class acquireReaderClass(Class tClass) { - DataValueClasses.directClassFor(tClass); Class readerClass = readersClassMap.get(tClass); if (readerClass != null) return readerClass; + synchronized (readersClassMap) { + if ((readerClass = readersClassMap.get(tClass)) != null) + return readerClass; + return compileReaderClass(tClass); + } + } + + private static Class compileReaderClass(Class tClass) { + DataValueClasses.directClassFor(tClass); + Class readerClass; DataValueModel dvmodel = DataValueModels.acquireModel(tClass); for (Class clazz : dvmodel.nestedModels()) { // touch them to make sure they are loaded. @@ -103,6 +112,15 @@ public final class DataValueBytesMarshallers { Class writerClass = writerClassMap.get(tClass); if (writerClass != null) return writerClass; + synchronized (writerClassMap) { + if ((writerClass = writerClassMap.get(tClass)) != null) + return writerClass; + return compileWriterClass(tClass); + } + } + + private static Class compileWriterClass(Class tClass) { + Class writerClass; DataValueModel dvmodel = DataValueModels.acquireModel(tClass); for (Class clazz : dvmodel.nestedModels()) { // touch them to make sure they are loaded. @@ -131,7 +149,16 @@ public final class DataValueBytesMarshallers { Class c = readersWithCustomFactoriesClassMap.get(tClass); if (c != null) return c; + synchronized (readersWithCustomFactoriesClassMap) { + if ((c = readersWithCustomFactoriesClassMap.get(tClass)) != null) + return c; + return compileReaderWithCustomFactory(tClass); + } + } + + private static Class compileReaderWithCustomFactory(Class tClass) { acquireReaderClass(tClass); + Class c; String actual = generateWithCustomFactoryClass(tClass); if (dumpCode) LoggerFactory.getLogger(DataValueGenerator.class).info(actual);