什么情况下使用的concurrenthashmap?
首先说明业务逻辑,如果 在某一业务员上传数据时,同业务组不可以更新数据库,但不同组可以,所以每进入写环节时,加锁。
代码实现:
申明一个
ConcurrentHashMap<String, AtomicBoolean>,
首先执行
lockMap.putIfAbsent(Id, new AtomicBoolean(true));
相当于如果deskID不存在,那么向map里放deskID,TRUE,如果存在,则返回TRUE,不做更新,至于为什么使用AtomicBoolean 因为他提供compare和set两个操作合在一起的原子性功能,而这也正是CAS提供的功能。
atomicBoolean = lockMap.get(Id);
如果没get到,则是FALSE
boolean b = atomicBoolean.compareAndSet(true, false);
这时分两种情况:
- 无人上传:map(当前ID,TRUE),get到TRUE,进入compareAndSet,返回TRUE(代表lockmap中的ID对应的boolean被成功设置成FALSE了,此时map中是map(当前ID,FALSE))
- 同组业务员正在上传:map(当前ID,FALSE),get到FALSE,进入compareAndSet,返回FALSE(代表lockmap中的ID对应的boolean是FALSE,不满足是TRUE时将值设置成FALSE,原子行为失败,所以返回FALSE,此时map中是map(当前ID,FALSE)),走友好提示
if (b) {
业务代码
} else {
throw new Exception(“友好提示”);
}
最后记得放开锁,也就是将map(当前ID,FALSE)恢复为map(当前ID,TRUE)
atomicBoolean.set(true);
提供一个小测试类
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
public class test {
private static final ConcurrentHashMap<String, AtomicBoolean> lockMap = new ConcurrentHashMap<>();
private static AtomicBoolean atomicBoolean = null;
public static void main(String[] args) throws Exception {
String Id = "0102";
int i = 0;
for (i = 0; i < 4; i++) {
if (i == 1) {
Id = "0103";
}
lockMap.putIfAbsent(Id, new AtomicBoolean(true));
atomicBoolean = lockMap.get(Id);
boolean b = atomicBoolean.compareAndSet(true, false);
if (b) {
System.out.println(1);
} else {
System.out.println(2);
atomicBoolean.set(true);
}
}
}
}