package com.ybjdw.tool.utils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class ConcurrentUtil {
private static ReentrantLock locker = new ReentrantLock();
private static Map keepAliveMap = new HashMap<>();
private static final Logger logger = LoggerFactory.getLogger(ConcurrentUtil.class);
public static boolean isUniqueRun(String key, Date curDate, int timeout){
boolean getLockFlag = false;
String threadName = Thread.currentThread().getName();
try{
for(int i=0; i < 3; i++){
if(locker.tryLock(1, TimeUnit.SECONDS)){ // 获取到锁
logger.debug("线程:{}获取到锁,key:{}", threadName, key);
getLockFlag = true;
if(StringUtils.isBlank(key) || curDate == null){
return false;
}
Date lastDate = keepAliveMap.get(key); // 上次运行时间
if(lastDate == null){
keepAliveMap.put(key, curDate);
return true;
}
if(lastDate.compareTo(curDate) > 0 ){
return false;
}
long diffSecond = (curDate.getTime() - lastDate.getTime())/1000;
if(diffSecond > timeout){
keepAliveMap.put(key, curDate);
return true;
}
}else{
logger.debug("线程:{}未获取到锁,等待0.5,key:{}", threadName, key);
Thread.sleep(500);
}
}
}catch (Exception e){
logger.debug("判断单节点唯一运行异常!", e);
} finally {
if(getLockFlag && locker.isHeldByCurrentThread()){ // 释放锁
logger.debug("线程:{}开始释放锁,key:{}", threadName, key);
locker.unlock();
}
}
return false;
}
}