Commit 6eb6d4cf by huluobin

考勤申请加锁

parent bfc6193d
package com.gogirl.infrastructure.util.lock;
import java.util.HashMap;
import java.util.concurrent.locks.ReentrantLock;
/**
*  * 分段锁,系统提供一定数量的原始锁,根据传入用户id值获取对应的锁并加锁  * 注意:要锁的用户id值如果发生改变,有可能导致锁无法成功释放!!!
*/
public class TechnicianIdLock {
private final static HashMap<Integer, ReentrantLock> lockMap = new HashMap<>();
private Integer segments = 500;// 默认分段数量
private TechnicianIdLock() {
init(null, false);
}
private TechnicianIdLock(Integer counts, boolean fair) {
init(counts, fair);
}
/*静态内部类实现单例*/
public static final TechnicianIdLock getInsatance() {
return SingletonHolder.instance;
}
private void init(Integer counts, boolean fair) {
if (counts != null) {
segments = counts;
}
for (int i = 0; i < segments; i++) {
lockMap.put(i, new ReentrantLock(fair));
}
}
public void lock(int key) {
ReentrantLock lock = lockMap.get(key % segments);
lock.lock();
}
public void unlock(int key) {
ReentrantLock lock = lockMap.get(key % segments);
lock.unlock();
}
@Override
public String toString() {
return "SegmentLock [segments=" + segments + ", lockMap=" + lockMap
+ "]";
}
/*静态内部类实现单例*/
private static class SingletonHolder {
private static final TechnicianIdLock instance = new TechnicianIdLock(null, true);
}
}
...@@ -8,6 +8,7 @@ import com.gogirl.domain.store.store.StoreTechnician; ...@@ -8,6 +8,7 @@ import com.gogirl.domain.store.store.StoreTechnician;
import com.gogirl.domain.xcx.GogirlToken; import com.gogirl.domain.xcx.GogirlToken;
import com.gogirl.infrastructure.common.base.JsonResult; import com.gogirl.infrastructure.common.base.JsonResult;
import com.gogirl.infrastructure.util.SessionUtils; import com.gogirl.infrastructure.util.SessionUtils;
import com.gogirl.infrastructure.util.lock.TechnicianIdLock;
import com.gogirl.shared.store.command.ApplyTakeLeaveCommand; import com.gogirl.shared.store.command.ApplyTakeLeaveCommand;
import com.gogirl.shared.store.command.ApprovalTakeLeaveCommand; import com.gogirl.shared.store.command.ApprovalTakeLeaveCommand;
import com.gogirl.shared.store.query.qry.PageApplyQuery; import com.gogirl.shared.store.query.qry.PageApplyQuery;
...@@ -35,7 +36,13 @@ public class TakeLeaveEventController { ...@@ -35,7 +36,13 @@ public class TakeLeaveEventController {
public JsonResult<Void> applyTakeLeave(@RequestHeader String token, public JsonResult<Void> applyTakeLeave(@RequestHeader String token,
@RequestBody ApplyTakeLeaveCommand cmd) { @RequestBody ApplyTakeLeaveCommand cmd) {
cmd.setApplyTechnicianId(SessionUtils.getTechnicianId()); cmd.setApplyTechnicianId(SessionUtils.getTechnicianId());
takeLeaveEventCmdService.applyTakeLeave(cmd); TechnicianIdLock lock = TechnicianIdLock.getInsatance();
try {
lock.lock(cmd.getApplyTechnicianId());
takeLeaveEventCmdService.applyTakeLeave(cmd);
} finally {
lock.unlock(cmd.getApplyTechnicianId());
}
return JsonResult.success(); return JsonResult.success();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment