2323import org .slf4j .LoggerFactory ;
2424
2525import java .util .*;
26+ import java .util .concurrent .ConcurrentHashMap ;
2627
2728/**
2829 * Mapping manager from which to obtain entity mappers.
@@ -34,9 +35,10 @@ public class MappingManager {
3435 private final Session session ;
3536 final boolean isCassandraV1 ;
3637
37- private volatile Map <Class <?>, Mapper <?>> mappers = Collections .emptyMap ();
38- private volatile Map <Class <?>, MappedUDTCodec <?>> udtCodecs = Collections .emptyMap ();
39- private volatile Map <Class <?>, Object > accessors = Collections .emptyMap ();
38+ private final ConcurrentHashMap <Class <?>, Mapper <?>> mappers = new ConcurrentHashMap <Class <?>, Mapper <?>>();
39+ private final ConcurrentHashMap <Class <?>, MappedUDTCodec <?>> udtCodecs = new ConcurrentHashMap <Class <?>, MappedUDTCodec <?>>();
40+ private final ConcurrentHashMap <Class <?>, Object > accessors = new ConcurrentHashMap <Class <?>, Object >();
41+
4042
4143 /**
4244 * Creates a new {@code MappingManager} using the provided {@code Session}.
@@ -220,15 +222,11 @@ public <T> T createAccessor(Class<T> klass) {
220222 private <T > Mapper <T > getMapper (Class <T > klass ) {
221223 Mapper <T > mapper = (Mapper <T >) mappers .get (klass );
222224 if (mapper == null ) {
223- synchronized (mappers ) {
224- mapper = (Mapper <T >) mappers .get (klass );
225- if (mapper == null ) {
226- EntityMapper <T > entityMapper = AnnotationParser .parseEntity (klass , this );
227- mapper = new Mapper <T >(this , klass , entityMapper );
228- Map <Class <?>, Mapper <?>> newMappers = new HashMap <Class <?>, Mapper <?>>(mappers );
229- newMappers .put (klass , mapper );
230- mappers = newMappers ;
231- }
225+ EntityMapper <T > entityMapper = AnnotationParser .parseEntity (klass , this );
226+ mapper = new Mapper <T >(this , klass , entityMapper );
227+ Mapper <T > old = (Mapper <T >) mappers .putIfAbsent (klass , mapper );
228+ if (old != null ) {
229+ mapper = old ;
232230 }
233231 }
234232 return mapper ;
@@ -238,16 +236,11 @@ private <T> Mapper<T> getMapper(Class<T> klass) {
238236 <T > TypeCodec <T > getUDTCodec (Class <T > mappedClass ) {
239237 MappedUDTCodec <T > codec = (MappedUDTCodec <T >) udtCodecs .get (mappedClass );
240238 if (codec == null ) {
241- synchronized (udtCodecs ) {
242- codec = (MappedUDTCodec <T >) udtCodecs .get (mappedClass );
243- if (codec == null ) {
244- codec = AnnotationParser .parseUDT (mappedClass , this );
245- session .getCluster ().getConfiguration ().getCodecRegistry ().register (codec );
246-
247- HashMap <Class <?>, MappedUDTCodec <?>> newCodecs = new HashMap <Class <?>, MappedUDTCodec <?>>(udtCodecs );
248- newCodecs .put (mappedClass , codec );
249- udtCodecs = newCodecs ;
250- }
239+ codec = AnnotationParser .parseUDT (mappedClass , this );
240+ session .getCluster ().getConfiguration ().getCodecRegistry ().register (codec );
241+ MappedUDTCodec <T > old = (MappedUDTCodec <T >) udtCodecs .putIfAbsent (mappedClass , codec );
242+ if (old != null ) {
243+ codec = old ;
251244 }
252245 }
253246 return codec ;
@@ -257,16 +250,12 @@ <T> TypeCodec<T> getUDTCodec(Class<T> mappedClass) {
257250 private <T > T getAccessor (Class <T > klass ) {
258251 T accessor = (T ) accessors .get (klass );
259252 if (accessor == null ) {
260- synchronized (accessors ) {
261- accessor = (T ) accessors .get (klass );
262- if (accessor == null ) {
263- AccessorMapper <T > mapper = AnnotationParser .parseAccessor (klass , this );
264- mapper .prepare (this );
265- accessor = mapper .createProxy ();
266- Map <Class <?>, Object > newAccessors = new HashMap <Class <?>, Object >(accessors );
267- newAccessors .put (klass , accessor );
268- accessors = newAccessors ;
269- }
253+ AccessorMapper <T > mapper = AnnotationParser .parseAccessor (klass , this );
254+ mapper .prepare (this );
255+ accessor = mapper .createProxy ();
256+ T old = (T ) accessors .putIfAbsent (klass , accessor );
257+ if (old != null ) {
258+ accessor = old ;
270259 }
271260 }
272261 return accessor ;
0 commit comments