package com.zhou.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 根据key来锁定
* @author lang.zhou
* @date 2022/3/22 17:45
*/
public class KeyLock {
private static Map<String,Object> lock = new ConcurrentHashMap<>();
/**
* 尝试对key加一个锁,返回加锁成功或失败
*/
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 "请稍后再试";
}
应当注意的是:这种内存中的锁,只在同一个jvm内生效。抢到锁的线程执行完一定要保证释放锁,否则其他线程将无法访问key值锁定的操作。没有抢到锁的线程不能执行释放锁的操作,否则会释放掉其他线程抢到的锁。