| | |
| | | import com.product.core.spring.context.SpringMVCContextHolder; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | | * @Author cheng |
| | |
| | | public class CustomLock { |
| | | |
| | | |
| | | private Set<String> obj = new ConcurrentHashSet<>(); |
| | | private Map<String, Long> obj = new ConcurrentHashMap<>(); |
| | | |
| | | |
| | | private long detectionWaitTime = 1000L; |
| | | private long detectionWaitTime = 1000L; |
| | | |
| | | |
| | | /** |
| | | * 无参构造时 |
| | | */ |
| | | public CustomLock() { |
| | | } |
| | | /** |
| | | * 无参构造时 |
| | | */ |
| | | public CustomLock() { |
| | | } |
| | | |
| | | /** |
| | | * @param detectionWaitTime 检测等待时间,单位毫秒 |
| | | */ |
| | | public CustomLock(long detectionWaitTime) { |
| | | this.detectionWaitTime = detectionWaitTime; |
| | | } |
| | | /** |
| | | * @param detectionWaitTime 检测等待时间,单位毫秒 |
| | | */ |
| | | public CustomLock(long detectionWaitTime) { |
| | | this.detectionWaitTime = detectionWaitTime; |
| | | } |
| | | |
| | | public boolean tryLock(String[] key) { |
| | | return this.tryLock(ArrayUtil.join(key, ",")); |
| | | } |
| | | public boolean tryLock(String[] key) { |
| | | return this.tryLock(ArrayUtil.join(key, ",")); |
| | | } |
| | | |
| | | public boolean tryLock(String key) { |
| | | if (!StringUtils.isEmpty(key)) { |
| | | key = key.toUpperCase(); |
| | | synchronized (key.intern()) { |
| | | if (!this.obj.contains(key)) { |
| | | lock(key); |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | public boolean tryLock(String key) { |
| | | if (!StringUtils.isEmpty(key)) { |
| | | key = key.toUpperCase(); |
| | | synchronized (key.intern()) { |
| | | if (!this.obj.containsKey(key)) { |
| | | lock(key); |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | |
| | | public void lock(String... key) { |
| | | this.lock(ArrayUtil.join(key, ",")); |
| | | } |
| | | public void lock(String... key) { |
| | | this.lock(ArrayUtil.join(key, ",")); |
| | | } |
| | | |
| | | public void lock(String key) { |
| | | String obj = key; |
| | | if (StringUtils.isEmpty(obj)) { |
| | | return; |
| | | } |
| | | obj = obj.toUpperCase(); |
| | | public void lock(String key) { |
| | | String obj = key; |
| | | if (StringUtils.isEmpty(obj)) { |
| | | return; |
| | | } |
| | | obj = obj.toUpperCase(); |
| | | // boolean enterLock = false; |
| | | long starTime = System.currentTimeMillis(); |
| | | Long outLogTime = null; |
| | | while (this.obj.contains(obj)) { |
| | | if (System.currentTimeMillis() - starTime >= (1000 * 60 * 5)) { |
| | | if (outLogTime == null || System.currentTimeMillis() - outLogTime >= (1000 * 60)) { |
| | | outLogTime = System.currentTimeMillis(); |
| | | SpringMVCContextHolder.getSystemLogger().error("等待释放锁时间超过5分钟,等待时间:" + (System.currentTimeMillis() - starTime) + "ms,lockKey:" + obj); |
| | | } |
| | | } |
| | | long starTime = System.currentTimeMillis(); |
| | | Long outLogTime = null; |
| | | while (this.obj.containsKey(obj)) { |
| | | if (System.currentTimeMillis() - starTime >= (1000 * 60 * 5)) { |
| | | if (outLogTime == null || System.currentTimeMillis() - outLogTime >= (1000 * 60)) { |
| | | outLogTime = System.currentTimeMillis(); |
| | | SpringMVCContextHolder.getSystemLogger().error("等待释放锁时间超过5分钟,等待时间:" + (System.currentTimeMillis() - starTime) + "ms,lockKey:" + obj); |
| | | } |
| | | } |
| | | // enterLock = true; |
| | | // SpringMVCContextHolder.getSystemLogger().info("锁释放等待,lockKey:" + obj); |
| | | ThreadUtil.sleep(this.detectionWaitTime); |
| | | } |
| | | ThreadUtil.sleep(this.detectionWaitTime); |
| | | } |
| | | // if (enterLock) { |
| | | // SpringMVCContextHolder.getSystemLogger().info("等待定时间:" + (System.currentTimeMillis() - starTime) + " ms,lockKey:" + obj); |
| | | // } |
| | | // SpringMVCContextHolder.getSystemLogger().info("上锁成功,lockKey:" + obj); |
| | | this.obj.add(obj); |
| | | } |
| | | this.obj.put(obj, System.currentTimeMillis()); |
| | | } |
| | | |
| | | public void unLock(String... key) { |
| | | String obj = ArrayUtil.join(key, ","); |
| | | unLock(obj); |
| | | } |
| | | public void unLock(String... key) { |
| | | String obj = ArrayUtil.join(key, ","); |
| | | unLock(obj); |
| | | } |
| | | |
| | | public void unLock(String key) { |
| | | public void unLock(String key) { |
| | | |
| | | if (StringUtils.isEmpty(key)) { |
| | | return; |
| | | } |
| | | this.obj.remove(key.toUpperCase()); |
| | | if (StringUtils.isEmpty(key)) { |
| | | return; |
| | | } |
| | | this.obj.remove(key.toUpperCase()); |
| | | // SpringMVCContextHolder.getSystemLogger().info("释放锁成功,lockKey:" + key); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |