From ce67b898619e3ce20cd842073bff0d166f95320e 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 (cherry picked from commit 396fb0cd513588863491929ddbfe22a49de05beb) --- .../support/GenericConversionService.java | 16 ++++++++-------- 1 file changed, 8 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 2e966c7a28e..1134483e88a 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 @@ -19,14 +19,15 @@ package org.springframework.core.convert.support; import java.lang.reflect.Array; 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.LinkedList; 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; @@ -499,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(); @@ -512,8 +513,7 @@ public class GenericConversionService implements ConfigurableConversionService { } else { for (ConvertiblePair convertiblePair : convertibleTypes) { - ConvertersForPair convertersForPair = getMatchableConverters(convertiblePair); - convertersForPair.add(converter); + getMatchableConverters(convertiblePair).add(converter); } } } @@ -651,7 +651,7 @@ public class GenericConversionService implements ConfigurableConversionService { */ private static class ConvertersForPair { - private final LinkedList converters = new LinkedList<>(); + private final Deque converters = new ConcurrentLinkedDeque<>(); public void add(GenericConverter converter) { this.converters.addFirst(converter);