killbill-aplcache

catalog: Add synchronization to fix exception during concurrent

1/20/2017 10:55:48 PM

Details

diff --git a/catalog/src/main/java/org/killbill/billing/catalog/CatalogSafetyInitializer.java b/catalog/src/main/java/org/killbill/billing/catalog/CatalogSafetyInitializer.java
index c04bb98..60f56e3 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/CatalogSafetyInitializer.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/CatalogSafetyInitializer.java
@@ -109,19 +109,23 @@ public class CatalogSafetyInitializer {
     }
 
     private static void initializeFieldWithValue(final Object obj, final Field f, final Object value) throws IllegalAccessException, ClassNotFoundException {
-        f.setAccessible(true);
-        if (f.get(obj) == null) {
-            f.set(obj, value);
+        synchronized (perCatalogClassNonRequiredFields) {
+            f.setAccessible(true);
+            if (f.get(obj) == null) {
+                f.set(obj, value);
+            }
+            f.setAccessible(false);
         }
-        f.setAccessible(false);
     }
 
     private static void initializeArrayIfNull(final Object obj, final Field f) throws IllegalAccessException, ClassNotFoundException {
-        f.setAccessible(true);
-        if (f.get(obj) == null) {
-            f.set(obj, getZeroLengthArrayInitializer(f));
+        synchronized (perCatalogClassNonRequiredFields) {
+            f.setAccessible(true);
+            if (f.get(obj) == null) {
+                f.set(obj, getZeroLengthArrayInitializer(f));
+            }
+            f.setAccessible(false);
         }
-        f.setAccessible(false);
     }