|
@@ -1,9 +1,7 @@
|
|
package cn.com.qmth.stmms.biz.mark.service.Impl;
|
|
package cn.com.qmth.stmms.biz.mark.service.Impl;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
-import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -21,7 +19,7 @@ public class MarkLockService {
|
|
|
|
|
|
protected static final Logger log = LoggerFactory.getLogger(MarkLockService.class);
|
|
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<>();
|
|
private Map<Integer, Boolean> studentMap = new ConcurrentHashMap<>();
|
|
|
|
|
|
@@ -31,10 +29,7 @@ public class MarkLockService {
|
|
* @param group
|
|
* @param group
|
|
*/
|
|
*/
|
|
public void lockGroup(Integer examId, String subjectCode, Integer groupNumber) {
|
|
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
|
|
* @param group
|
|
*/
|
|
*/
|
|
public void unlockGroup(Integer examId, String subjectCode, Integer groupNumber) {
|
|
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
|
|
* @param group
|
|
*/
|
|
*/
|
|
public void waitUnlockGroup(Integer examId, String subjectCode, Integer groupNumber) {
|
|
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) {
|
|
private String getKey(Integer examId, String subjectCode, Integer groupNumber) {
|
|
return examId + "_" + subjectCode + "_" + groupNumber;
|
|
return examId + "_" + subjectCode + "_" + groupNumber;
|
|
}
|
|
}
|