package com.zhou.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class KeyLock {
private static Map lock = new ConcurrentHashMap<>();
public static boolean lock(String key){
Object my = new Object();
Object o = lock.computeIfAbsent(key,l->my);
return my == o;
}
public static void unlock(String key){
lock.remove(key);
}
}
上述代码在并发场景中,key值相同的线程会争抢锁,但只有一个线程能抢到锁,其他没有抢到锁的线程,不去等待锁释放,直接返回失败,可以避免高并发场景下线程阻塞而导致服务器资源耗尽。
if(KeyLock.lock(key)){
try{
//do something
}finally {
//加锁成功后,一定要在finally里面解锁,保证锁一定会释放
KeyLock.unlock(key);
}
}else{
return "请稍后再试";
}
应当注意的是:抢到锁的线程执行完一定要保证释放锁,否则其他线程将无法访问key值锁定的操作



