首页 > 系统相关 >java 内存锁

java 内存锁

时间:2023-02-17 14:13:35浏览次数:43  
标签:map return lock granular 内存 Lock java

import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author CW
* @ClassName LockUtil.java
* @createTime 2023年02月09日 16:24:00
*/
@Slf4j
public class LockUtil {
private final static Map<String, Lock> map = new ConcurrentHashMap();
private final static Map<String, Lock> map2 = new ConcurrentHashMap();

public final static String SAVE_DTU_LOCK = "SAVE_DTU_LOCK:";

/**
* 细粒度lock,自定义 MyReentrantLock,会清理map中的lock
* 若不清理lock对象,可能会导致内存溢出的情况,
*
* @param granular 冲突粒度,据此判断是否创建新lock对象
* @author XHS-2021
* @date 2022/7/2 16:56
* @return java.util.concurrent.locks.Lock
*/
public static Lock getLock(String granular){
Lock lock = map.get(granular);
if(lock != null){
return lock;
}else{
lock = map.putIfAbsent(granular, new MyReentrantLock(granular));
if(lock == null){
return getLock(granular);
}else{
return lock;
}
}
}

/**
* 【慎用】
* 粗粒度lock,不会清理map中lock,会一直累计,长久下去要考虑内存溢出的情况
*
* @param granular
* @author XHS-2021
* @date 2022/7/2 16:57
* @return java.util.concurrent.locks.Lock
*/
public static Lock getCoarseGrainLock(String granular){
Lock lock = map2.get(granular);
if(lock != null){
return lock;
}else{
lock = map2.putIfAbsent(granular, new ReentrantLock());
if(lock == null){
return getLock(granular);
}else{
return lock;
}
}
}

static class MyReentrantLock extends ReentrantLock{
String granular;
public MyReentrantLock(String granular) {
super();
this.granular = granular;
}

@Override
public void unlock() {
if(map.containsKey(granular)){
map.remove(granular);
try {
super.unlock();
} catch (IllegalMonitorStateException e) {
// log.error(e.getMessage(), e);
}
}
}
}


}


调用:
Lock lock = LockUtil.getLock(key);
if (lock.tryLock(10, TimeUnit.SECONDS)) {
try {

} finally {
lock.unlock();
}
}else{
throw new RuntimeException("失败,请重试!");
}






标签:map,return,lock,granular,内存,Lock,java
From: https://www.cnblogs.com/cw828/p/17129921.html

相关文章

  • Java: RocketMQ事务消息的优雅使用
    背景在项目中,技术方案需要使用事务消息来保证最终一致性达到实现业务的目的。但在一个服务中有多个业务需要使用事务消息发送不同的消息类型到不同的Topic时,RocketMQ的本......
  • java二维数组
    1.查找1)顺序查找SeqSearch.java2)二分查找【二分法,放在算法讲解】2.顺序查找有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判......
  • 内存检测工具
                    ......
  • javascript的一些基础知识
    随手记录一些javascript的一些基础知识,之前只是简单用到javascript,并没有了解其中的概念。1. JavascriptObject:InJavaScript,almost"everything"isanobject.......
  • java基础巩固-详解泛型
    java泛型(generics)为jdk5引入的新特性,泛型提供了编译时类型安全检测机制,可以在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参......
  • JAVA 学习笔记(五)
      子类通过方法的重写机制可以隐藏继承父类的方法,把父类的状态和行为改变为子类自己的状态和行为.假如父类中有一个方法myMethod(),一旦子类重写了超类的方法myMethod......
  • JAVA 抽象类
    抽象类 在java语言继承层次结构中,位于上层的类更具有通用性,甚至更加抽象,这些类封装的方法被重写的可能更大.java用关键字  abstract 格式为: [访问控制符]a......
  • 找素数(java)
    什么是素数?质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。实际案例比如我们想找出1-1000......
  • 2023-02-Java面试经历
    2022年12月中旬不幸被裁,拿N+1撤了,临近过年在家休息了一个月,元宵节之前从山西返杭的,2月7号开始投简历,谈谈最近面试的经历吧,期望能在2月底3月初左右入职吧....................
  • 1.1 Java介绍
    1.1Java介绍Java之父:詹姆斯·高斯林(JamesGosling)。Java三大平台:JavaSE:Java语言的(标准版),用于桌面应用的开发,是其他两个版本的基础。JavaME:Java语言的(小型版......