From 5784d7c07870ab43bd09f1d8c4141c730528a652 Mon Sep 17 00:00:00 2001 From: JarrodCTaylor Date: Mon, 2 Feb 2026 10:08:19 -0600 Subject: [PATCH] Fix lock contention in handler cache (Issue #38) Replace synchronized Cache with ConcurrentHashMap --- .../com/cognitect/transit/impl/Cache.java | 19 ------------------- .../cognitect/transit/impl/ReaderFactory.java | 15 ++++++--------- .../cognitect/transit/impl/WriterFactory.java | 17 +++++++---------- 3 files changed, 13 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/com/cognitect/transit/impl/Cache.java diff --git a/src/main/java/com/cognitect/transit/impl/Cache.java b/src/main/java/com/cognitect/transit/impl/Cache.java deleted file mode 100644 index e9736f7..0000000 --- a/src/main/java/com/cognitect/transit/impl/Cache.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Cognitect, Inc. -// All rights reserved. - -package com.cognitect.transit.impl; - -import java.util.LinkedHashMap; -import java.util.Map; - -public class Cache extends LinkedHashMap { - - public Cache() { - super(10); - } - - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > 10; - } -} diff --git a/src/main/java/com/cognitect/transit/impl/ReaderFactory.java b/src/main/java/com/cognitect/transit/impl/ReaderFactory.java index 3d8f828..f3bca35 100644 --- a/src/main/java/com/cognitect/transit/impl/ReaderFactory.java +++ b/src/main/java/com/cognitect/transit/impl/ReaderFactory.java @@ -12,10 +12,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class ReaderFactory { - private static Map>, ReadHandlerMap> handlerCache = new Cache>, ReadHandlerMap>(); + private static final ConcurrentHashMap>, ReadHandlerMap> handlerCache = new ConcurrentHashMap<>(); public static Map> defaultHandlers() { @@ -59,14 +60,10 @@ private static Map> handlerMap(Map>, WriteHandlerMap> handlerCache = new Cache>, WriteHandlerMap>(); + private static final ConcurrentHashMap>, WriteHandlerMap> handlerCache = new ConcurrentHashMap<>(); private static WriteHandlerMap buildWriteHandlerMap(Map> customHandlers) { if (customHandlers instanceof WriteHandlerMap) return new WriteHandlerMap(customHandlers); - WriteHandlerMap writeHandlerMap; - synchronized (handlerCache) { - writeHandlerMap = handlerCache.get(customHandlers); - if (writeHandlerMap == null) { - writeHandlerMap = new WriteHandlerMap(customHandlers); - handlerCache.put(customHandlers, writeHandlerMap); - } - } - return new WriteHandlerMap(writeHandlerMap); + if (customHandlers == null) + return new WriteHandlerMap(); + + WriteHandlerMap cached = handlerCache.computeIfAbsent(customHandlers, WriteHandlerMap::new); + return new WriteHandlerMap(cached); } private static WriteHandlerMap verboseHandlerMap(Map> customHandlers) {