From 396fb0cd513588863491929ddbfe22a49de05beb Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 2 Dec 2020 12:25:37 +0100 Subject: [PATCH] Support for multi-threaded addConverter calls Closes gh-26183 --- .../convert/support/GenericConversionService.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java b/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java index f64ee4bcba..1134483e88 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java @@ -17,17 +17,17 @@ package org.springframework.core.convert.support; import java.lang.reflect.Array; -import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.Deque; import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.CopyOnWriteArraySet; import org.springframework.core.DecoratingProxy; import org.springframework.core.ResolvableType; @@ -500,9 +500,9 @@ public class GenericConversionService implements ConfigurableConversionService { */ private static class Converters { - private final Set globalConverters = new LinkedHashSet<>(); + private final Set globalConverters = new CopyOnWriteArraySet<>(); - private final Map converters = new LinkedHashMap<>(36); + private final Map converters = new ConcurrentHashMap<>(256); public void add(GenericConverter converter) { Set convertibleTypes = converter.getConvertibleTypes(); @@ -513,8 +513,7 @@ public class GenericConversionService implements ConfigurableConversionService { } else { for (ConvertiblePair convertiblePair : convertibleTypes) { - ConvertersForPair convertersForPair = getMatchableConverters(convertiblePair); - convertersForPair.add(converter); + getMatchableConverters(convertiblePair).add(converter); } } } @@ -652,7 +651,7 @@ public class GenericConversionService implements ConfigurableConversionService { */ private static class ConvertersForPair { - private final Deque converters = new ArrayDeque<>(1); + private final Deque converters = new ConcurrentLinkedDeque<>(); public void add(GenericConverter converter) { this.converters.addFirst(converter);