Skip to content

Commit f0948b0

Browse files
authored
Merge pull request apache#803 from avivcarmis/3.x
Improve mapping manager synchronization
2 parents 43b6040 + a542078 commit f0948b0

1 file changed

Lines changed: 21 additions & 32 deletions

File tree

driver-mapping/src/main/java/com/datastax/driver/mapping/MappingManager.java

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.slf4j.LoggerFactory;
2424

2525
import 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

Comments
 (0)