fix: concurrency safety in ProcessotTrackerPool

This commit is contained in:
tjq 2020-12-05 10:36:33 +08:00
parent b4f92bbc25
commit 9db9d0d01f

View File

@ -25,17 +25,12 @@ public class ProcessorTrackerPool {
/** /**
* 获取 ProcessorTracker如果不存在则创建 * 获取 ProcessorTracker如果不存在则创建
*/ */
public static ProcessorTracker getProcessorTracker(Long instanceId, String address, Supplier<ProcessorTracker> creator) { public static synchronized ProcessorTracker getProcessorTracker(Long instanceId, String address, Supplier<ProcessorTracker> creator) {
ProcessorTracker processorTracker = processorTrackerPool.getOrDefault(instanceId, Collections.emptyMap()).get(address); ProcessorTracker processorTracker = processorTrackerPool.getOrDefault(instanceId, Collections.emptyMap()).get(address);
if (processorTracker == null) { if (processorTracker == null) {
synchronized (ProcessorTrackerPool.class) { processorTracker = creator.get();
processorTracker = processorTrackerPool.getOrDefault(instanceId, Collections.emptyMap()).get(address); processorTrackerPool.computeIfAbsent(instanceId, ignore -> Maps.newHashMap()).put(address, processorTracker);
if (processorTracker == null) {
processorTracker = creator.get();
processorTrackerPool.computeIfAbsent(instanceId, ignore -> Maps.newHashMap()).put(address, processorTracker);
}
}
} }
return processorTracker; return processorTracker;
} }