diff --git a/YamlDotNet/Serialization/Utilities/TypeConverterCache.cs b/YamlDotNet/Serialization/Utilities/TypeConverterCache.cs index 678e9193..683658ea 100644 --- a/YamlDotNet/Serialization/Utilities/TypeConverterCache.cs +++ b/YamlDotNet/Serialization/Utilities/TypeConverterCache.cs @@ -20,6 +20,7 @@ // SOFTWARE. using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; @@ -32,7 +33,7 @@ namespace YamlDotNet.Serialization.Utilities internal sealed class TypeConverterCache { private readonly IYamlTypeConverter[] typeConverters; - private readonly Dictionary cache = new(); + private readonly ConcurrentDictionary cache = new(); public TypeConverterCache(IEnumerable? typeConverters) : this(typeConverters?.ToArray() ?? Array.Empty()) { @@ -51,18 +52,15 @@ public TypeConverterCache(IYamlTypeConverter[] typeConverters) /// if a type converter was found; otherwise. public bool TryGetConverterForType(Type type, [NotNullWhen(true)] out IYamlTypeConverter? typeConverter) { - if (cache.TryGetValue(type, out var result)) + var result = cache.GetOrAdd(type, (t) => { - typeConverter = result.TypeConverter; - return result.HasMatch; - } - - typeConverter = LookupTypeConverter(type); - - var found = typeConverter is not null; - cache[type] = (found, typeConverter!); + var converter = LookupTypeConverter(type); + var found = converter != null; + return (found, converter); + }); - return found; + typeConverter = result.TypeConverter; + return result.HasMatch; } ///