Browse Source

新增lock api

zhouhao 8 years ago
parent
commit
1530d2a800

+ 13 - 5
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-api/src/main/java/org/hswebframework/web/concurrent/lock/AbstactLocakFactory.java

@@ -1,7 +1,7 @@
 package org.hswebframework.web.concurrent.lock;
 
+import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 
@@ -11,17 +11,25 @@ import java.util.concurrent.locks.ReadWriteLock;
  * @author zhouhao
  */
 public abstract class AbstactLocakFactory implements LockFactory {
-    private Map<String, Lock>          lockStore          = new ConcurrentHashMap<>(128);
-    private Map<String, ReadWriteLock> readWriteLockStore = new ConcurrentHashMap<>(128);
+    private final Map<String, Lock>          lockStore          = new HashMap<>(128);
+    private final Map<String, ReadWriteLock> readWriteLockStore = new HashMap<>(128);
 
     @Override
     public Lock getLock(String lockKey) {
-        return lockStore.computeIfAbsent(lockKey, this::createLock);
+        Lock lock = lockStore.get(lockKey);
+        if (lock != null) return lock;
+        synchronized (lockStore) {
+            return lockStore.computeIfAbsent(lockKey, this::createLock);
+        }
     }
 
     @Override
     public ReadWriteLock getReadWriteLock(String lockKey) {
-        return readWriteLockStore.computeIfAbsent(lockKey, this::createReadWriteLock);
+        ReadWriteLock lock = readWriteLockStore.get(lockKey);
+        if (lock != null) return lock;
+        synchronized (readWriteLockStore) {
+            return readWriteLockStore.computeIfAbsent(lockKey, this::createReadWriteLock);
+        }
     }
 
     protected abstract Lock createLock(String lockKey);

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-api/src/main/java/org/hswebframework/web/concurrent/lock/SimpleLocakFactory.java

@@ -14,7 +14,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
  * @see AbstactLocakFactory
  * @since 3.0
  */
-public class SimpleLocakFactory extends AbstactLocakFactory {
+public class SimpleLockFactory extends AbstactLocakFactory {
     @Override
     protected synchronized Lock createLock(String lockKey) {
         return new ReentrantLock();

+ 2 - 4
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-api/src/test/java/org/hswebframework/web/concurrent/lok/SimpleLockTests.java

@@ -1,12 +1,10 @@
 package org.hswebframework.web.concurrent.lok;
 
 import org.hswebframework.web.concurrent.lock.LockFactory;
-import org.hswebframework.web.concurrent.lock.SimpleLocakFactory;
+import org.hswebframework.web.concurrent.lock.SimpleLockFactory;
 import org.junit.Assert;
 import org.junit.Test;
-import org.slf4j.Logger;
 
-import java.math.BigDecimal;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.function.Consumer;
@@ -18,7 +16,7 @@ import java.util.function.Consumer;
  */
 public class SimpleLockTests {
 
-    private LockFactory lockFactory = new SimpleLocakFactory();
+    private LockFactory lockFactory = new SimpleLockFactory();
 
     private long counter = 0;