ソースを参照

synchronized (target) 获取到某个 Class 锁,仍然无法阻止其它线程获取到另外的 Class 锁,从而造成并发修改
HashMap,改为使用 SyncWriteMap 防止并发写

James 2 年 前
コミット
d7dc971249

+ 8 - 11
src/main/java/com/jfinal/ext/proxy/JavassistProxyFactory.java

@@ -16,8 +16,7 @@
 
 package com.jfinal.ext.proxy;
 
-import java.util.HashMap;
-import java.util.Map;
+import com.jfinal.kit.SyncWriteMap;
 import com.jfinal.proxy.ProxyFactory;
 import javassist.util.proxy.ProxyObject;
 
@@ -33,7 +32,7 @@ import javassist.util.proxy.ProxyObject;
  */
 public class JavassistProxyFactory extends ProxyFactory {
     
-    protected Map<Class<?>, Class<?>> cache = new HashMap<>(1024, 0.25F);
+    protected SyncWriteMap<Class<?>, Class<?>> cache = new SyncWriteMap<>(1024, 0.25F);
     protected JavassistCallback callback = new JavassistCallback();
     
     @SuppressWarnings("unchecked")
@@ -60,14 +59,12 @@ public class JavassistProxyFactory extends ProxyFactory {
     
     @SuppressWarnings("unchecked")
     protected <T> Class<T> getProxyClass(Class<T> target) throws ReflectiveOperationException {
-        synchronized (target) {
-            return (Class<T>) cache.computeIfAbsent(target, key -> {
-                javassist.util.proxy.ProxyFactory factory = new javassist.util.proxy.ProxyFactory();
-                factory.setSuperclass(key);
-                return factory.createClass();
-            });
-        }
-	}
+        return (Class<T>) cache.computeIfAbsent(target, key -> {
+            javassist.util.proxy.ProxyFactory factory = new javassist.util.proxy.ProxyFactory();
+            factory.setSuperclass(key);
+            return factory.createClass();
+        });
+    }
 }