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,18 +25,13 @@ 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) {
synchronized (ProcessorTrackerPool.class) {
processorTracker = processorTrackerPool.getOrDefault(instanceId, Collections.emptyMap()).get(address);
if (processorTracker == null) { if (processorTracker == null) {
processorTracker = creator.get(); processorTracker = creator.get();
processorTrackerPool.computeIfAbsent(instanceId, ignore -> Maps.newHashMap()).put(address, processorTracker); processorTrackerPool.computeIfAbsent(instanceId, ignore -> Maps.newHashMap()).put(address, processorTracker);
} }
}
}
return processorTracker; return processorTracker;
} }