Browse Source

简化全局内存锁的评卷分组锁实现方式

luoshi 6 years ago
parent
commit
698e424b72

+ 5 - 27
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLockService.java

@@ -1,9 +1,7 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
-import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -21,7 +19,7 @@ public class MarkLockService {
 
     protected static final Logger log = LoggerFactory.getLogger(MarkLockService.class);
 
-    private Map<String, AtomicBoolean> groupMap = new HashMap<>();
+    private Map<String, Boolean> groupMap = new ConcurrentHashMap<>();
 
     private Map<Integer, Boolean> studentMap = new ConcurrentHashMap<>();
 
@@ -31,10 +29,7 @@ public class MarkLockService {
      * @param group
      */
     public void lockGroup(Integer examId, String subjectCode, Integer groupNumber) {
-        AtomicBoolean groupLock = getLock(groupMap, getKey(examId, subjectCode, groupNumber));
-        while (!groupLock.get()) {
-            groupLock.compareAndSet(false, true);
-        }
+        groupMap.put(getKey(examId, subjectCode, groupNumber), Boolean.TRUE);
     }
 
     /**
@@ -43,10 +38,7 @@ public class MarkLockService {
      * @param group
      */
     public void unlockGroup(Integer examId, String subjectCode, Integer groupNumber) {
-        AtomicBoolean groupLock = getLock(groupMap, getKey(examId, subjectCode, groupNumber));
-        while (groupLock.get()) {
-            groupLock.compareAndSet(true, false);
-        }
+        groupMap.remove(getKey(examId, subjectCode, groupNumber));
     }
 
     /**
@@ -55,8 +47,8 @@ public class MarkLockService {
      * @param group
      */
     public void waitUnlockGroup(Integer examId, String subjectCode, Integer groupNumber) {
-        AtomicBoolean groupLock = getLock(groupMap, getKey(examId, subjectCode, groupNumber));
-        while (groupLock.get()) {
+        String key = getKey(examId, subjectCode, groupNumber);
+        while (groupMap.get(key) != null) {
             ;
         }
     }
@@ -90,20 +82,6 @@ public class MarkLockService {
         }
     }
 
-    private AtomicBoolean getLock(Map<String, AtomicBoolean> map, String key) {
-        AtomicBoolean lock = map.get(key);
-        if (lock == null) {
-            synchronized (map) {
-                lock = map.get(key);
-                if (lock == null) {
-                    lock = new AtomicBoolean(false);
-                    map.put(key, lock);
-                }
-            }
-        }
-        return lock;
-    }
-
     private String getKey(Integer examId, String subjectCode, Integer groupNumber) {
         return examId + "_" + subjectCode + "_" + groupNumber;
     }