This is an automated email from the ASF dual-hosted git repository.

mariofusco pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 1eee5deda4 [KIE-1662] Make KieServiceLoader cache thread-safe (#6177)
1eee5deda4 is described below

commit 1eee5deda4b574ef04ef2cf7d5e58269c38f39fd
Author: Mario Fusco <[email protected]>
AuthorDate: Tue Dec 3 10:15:58 2024 +0100

    [KIE-1662] Make KieServiceLoader cache thread-safe (#6177)
    
    * [KIE-1662] Make KieServiceLoader cache thread-safe
    
    * wip
    
    * wip
---
 .../java/org/kie/api/internal/utils/KieServiceLoader.java | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git 
a/kie-api/src/main/java/org/kie/api/internal/utils/KieServiceLoader.java 
b/kie-api/src/main/java/org/kie/api/internal/utils/KieServiceLoader.java
index 82ae6d55a9..8df4d8dd78 100644
--- a/kie-api/src/main/java/org/kie/api/internal/utils/KieServiceLoader.java
+++ b/kie-api/src/main/java/org/kie/api/internal/utils/KieServiceLoader.java
@@ -18,9 +18,9 @@
  */
 package org.kie.api.internal.utils;
 
-import java.util.HashMap;
 import java.util.Map;
 import java.util.ServiceLoader;
+import java.util.concurrent.ConcurrentHashMap;
 
 import static org.kie.api.internal.utils.KieService.UNDEFINED;
 
@@ -28,7 +28,9 @@ public class KieServiceLoader {
 
     static final KieServiceLoader INSTANCE = new KieServiceLoader();
 
-    private final Map<String, KieService> serviceCache = new HashMap<>();
+    private static final KieService DUMMY_SERIVCE = new KieService() {};
+
+    private final Map<String, KieService> serviceCache = new 
ConcurrentHashMap<>();
 
     private KieServiceLoader() {}
 
@@ -38,11 +40,14 @@ public class KieServiceLoader {
 
     <T extends KieService> T lookup(Class<T> serviceClass, String tag) {
         String serviceKey = serviceClass.getName() + ":" + tag;
-        if (serviceCache.containsKey(serviceKey)) {
-            return (T) serviceCache.get(serviceKey);
+
+        T cachedService = (T) serviceCache.get(serviceKey);
+        if (cachedService != null) {
+            return cachedService == DUMMY_SERIVCE ? null : cachedService;
         }
+
         T loadedService = load(serviceClass, tag);
-        serviceCache.put(serviceKey, load(serviceClass, tag));
+        serviceCache.put(serviceKey, loadedService == null ? DUMMY_SERIVCE : 
loadedService);
         return loadedService;
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to