From 8a52f03bb9d6bc0e1f47f12e8f446552be0f4fa0 Mon Sep 17 00:00:00 2001 From: Andrei Solntsev Date: Mon, 29 Jul 2024 00:33:02 +0300 Subject: [PATCH] #1306 fix usage of CopyOnWriteMap in FakeValuesService Instead of two separate calls `putIfAbsent` and `get`, now we use `computeIfAbsent`. Before this change, `get` sometimes returned null (apparently, because of GC or parallel threads or something similar). --- .../java/net/datafaker/service/FakeValuesService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/datafaker/service/FakeValuesService.java b/src/main/java/net/datafaker/service/FakeValuesService.java index 64e8678a6..b32a86444 100644 --- a/src/main/java/net/datafaker/service/FakeValuesService.java +++ b/src/main/java/net/datafaker/service/FakeValuesService.java @@ -998,10 +998,10 @@ private MethodAndCoercedArgs retrieveMethodAccessor(Object object, String method return accessorMap.get(args); } final MethodAndCoercedArgs accessor = accessor(clazz, methodName, args); - final Map> stringMapMap = - MAP_OF_METHOD_AND_COERCED_ARGS.computeIfAbsent(clazz, t -> new CopyOnWriteMap<>(WeakHashMap::new)); - stringMapMap.putIfAbsent(methodName, new CopyOnWriteMap<>(WeakHashMap::new)); - stringMapMap.get(methodName).putIfAbsent(args, accessor); + MAP_OF_METHOD_AND_COERCED_ARGS + .computeIfAbsent(clazz, cl -> new CopyOnWriteMap<>(WeakHashMap::new)) + .computeIfAbsent(methodName, mn -> new CopyOnWriteMap<>(WeakHashMap::new)) + .putIfAbsent(args, accessor); if (accessor == null) { LOG.fine("Can't find method on " + object.getClass().getSimpleName()