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

liujun pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new dad55714ca Fix Hessian Serializer Factory concurrent issue (#13122)
dad55714ca is described below

commit dad55714caff3c03a0c5a806ae35e84e58ea1b3b
Author: Albumen Kevin <[email protected]>
AuthorDate: Tue Sep 26 10:44:07 2023 +0800

    Fix Hessian Serializer Factory concurrent issue (#13122)
---
 .../serialize/hessian2/Hessian2FactoryManager.java | 33 ++++++++--------------
 .../hessian2/Hessian2SerializerFactory.java        |  4 ++-
 2 files changed, 15 insertions(+), 22 deletions(-)

diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2FactoryManager.java
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2FactoryManager.java
index 8391ff2f09..dbd595bcd5 100644
--- 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2FactoryManager.java
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2FactoryManager.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.common.serialize.hessian2;
 
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
 import org.apache.dubbo.common.utils.DefaultSerializeClassChecker;
 import org.apache.dubbo.common.utils.SerializeCheckStatus;
 import org.apache.dubbo.common.utils.SerializeSecurityManager;
@@ -24,7 +25,6 @@ import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import com.alibaba.com.caucho.hessian.io.SerializerFactory;
 
-import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 
@@ -34,7 +34,7 @@ public class Hessian2FactoryManager {
     String DENY = "dubbo.application.hessian2.deny";
     private volatile SerializerFactory SYSTEM_SERIALIZER_FACTORY;
     private volatile SerializerFactory stickySerializerFactory = null;
-    private final Map<ClassLoader, SerializerFactory> CL_2_SERIALIZER_FACTORY 
= new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<ClassLoader, SerializerFactory> 
CL_2_SERIALIZER_FACTORY = new ConcurrentHashMap<>();
 
     private final SerializeSecurityManager serializeSecurityManager;
     private final DefaultSerializeClassChecker defaultSerializeClassChecker;
@@ -55,7 +55,7 @@ public class Hessian2FactoryManager {
             if (SYSTEM_SERIALIZER_FACTORY == null) {
                 synchronized (this) {
                     if (SYSTEM_SERIALIZER_FACTORY == null) {
-                        SYSTEM_SERIALIZER_FACTORY = createSerializerFactory();
+                        SYSTEM_SERIALIZER_FACTORY = 
createSerializerFactory(null);
                     }
                 }
             }
@@ -63,39 +63,30 @@ public class Hessian2FactoryManager {
             return SYSTEM_SERIALIZER_FACTORY;
         }
 
-        SerializerFactory factory = CL_2_SERIALIZER_FACTORY.get(classLoader);
-        if (factory == null) {
-            synchronized (this) {
-                if (!CL_2_SERIALIZER_FACTORY.containsKey(classLoader)) {
-                    SerializerFactory serializerFactory = 
createSerializerFactory();
-                    CL_2_SERIALIZER_FACTORY.put(classLoader, 
serializerFactory);
-                    stickySerializerFactory = serializerFactory;
-                    return serializerFactory;
-                }
-            }
-        }
+        SerializerFactory factory = 
ConcurrentHashMapUtils.computeIfAbsent(CL_2_SERIALIZER_FACTORY,
+            classLoader, this::createSerializerFactory);
         stickySerializerFactory = factory;
         return factory;
     }
 
-    private SerializerFactory createSerializerFactory() {
+    private SerializerFactory createSerializerFactory(ClassLoader classLoader) 
{
         String whitelist = System.getProperty(WHITELIST);
         if (StringUtils.isNotEmpty(whitelist)) {
-            return createWhiteListSerializerFactory();
+            return createWhiteListSerializerFactory(classLoader);
         }
 
-        return createDefaultSerializerFactory();
+        return createDefaultSerializerFactory(classLoader);
     }
 
-    private SerializerFactory createDefaultSerializerFactory() {
-        Hessian2SerializerFactory hessian2SerializerFactory = new 
Hessian2SerializerFactory(defaultSerializeClassChecker);
+    private SerializerFactory createDefaultSerializerFactory(ClassLoader 
classLoader) {
+        Hessian2SerializerFactory hessian2SerializerFactory = new 
Hessian2SerializerFactory(classLoader, defaultSerializeClassChecker);
         
hessian2SerializerFactory.setAllowNonSerializable(Boolean.parseBoolean(System.getProperty("dubbo.hessian.allowNonSerializable",
 "false")));
         
hessian2SerializerFactory.getClassFactory().allow("org.apache.dubbo.*");
         return hessian2SerializerFactory;
     }
 
-    public SerializerFactory createWhiteListSerializerFactory() {
-        SerializerFactory serializerFactory = new 
Hessian2SerializerFactory(defaultSerializeClassChecker);
+    public SerializerFactory createWhiteListSerializerFactory(ClassLoader 
classLoader) {
+        SerializerFactory serializerFactory = new 
Hessian2SerializerFactory(classLoader, defaultSerializeClassChecker);
         String whiteList = System.getProperty(WHITELIST);
         if ("true".equals(whiteList)) {
             serializerFactory.getClassFactory().setWhitelist(true);
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
index 893e1a59c6..b6bf38fbe0 100644
--- 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
@@ -30,7 +30,9 @@ public class Hessian2SerializerFactory extends 
SerializerFactory {
 
     private final DefaultSerializeClassChecker defaultSerializeClassChecker;
 
-    public Hessian2SerializerFactory(DefaultSerializeClassChecker 
defaultSerializeClassChecker) {
+
+    public Hessian2SerializerFactory(ClassLoader classLoader, 
DefaultSerializeClassChecker defaultSerializeClassChecker) {
+        super(classLoader);
         this.defaultSerializeClassChecker = defaultSerializeClassChecker;
     }
 

Reply via email to