java 使用ConcurrentHashMap和计数器实现锁
发布时间 - 2026-01-11 01:26:38 点击率:次java 使用ConcurrentHashMap和计数器实现锁

在某些场景下,我们想让线程根据某些业务数据进行排队,简单代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class TestServiceImpl {
private static ConcurrentHashMap<Long, LockObj> lockMap = new ConcurrentHashMap<Long, LockObj>(40);
public void test(Long userId){
LockObj lock = tryLock(userId);
synchronized (lock) {
try{
//处理业务
}
finally{
unLock(lock);
}
}
}
private LockObj tryLock(Long key) {
LockObj curVal = new LockObj(key);
LockObj preVal = lockMap.putIfAbsent(key, curVal);
if (null == preVal) {
curVal.inc();
return curVal;
}
else{
preVal.inc();
}
return preVal;
}
private void unLock(LockObj lock){
if (lock.dec() <= 0){
lockMap.remove(lock.getKey());
}
}
public class LockObj {
private long key = 0;
private AtomicInteger count = new AtomicInteger(0);
public LockObj(long key){
this.key = key;
}
public int inc(){
return count.incrementAndGet();
}
public int dec(){
return count.decrementAndGet();
}
public long getKey(){
return key;
}
@Override
public String toString() {
return "LockObj [key=" + key + ", count=" + count + "]";
}
}
}
按照userId来排队,如果每个线程处理数据后不释放锁的话,那么可以不利用计数器。但是加了释放锁的操作,则必须加上计算器。因为当线程把锁释放掉后,还没来得及退出synchronized 代码块时,另外一个线程调用了tryLock方法,那该线程将拿到另外一个对象的锁,导致利用synchronized 关键字进行userId排队失败。
也可以利用guava的API来实现。
import com.google.common.collect.Interner;
import com.google.common.collect.Interners;
public class TestServiceImpl {
Interner<String> pool = Interners.newWeakInterner();
public void test(Long userId) throws OspException {
synchronized ( pool.intern(String.valueOf(userId))){
//处理业务操作
}
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# ConcurrentHashMap和计数器实现锁
# ConcurrentHashMap
# Java中遍历ConcurrentHashMap的四种方式详解
# Java ConcurrentHashMap的使用示例
# Java源码解析ConcurrentHashMap的初始化
# Java中ConcurrentHashMap是如何实现线程安全
# Java 中ConcurrentHashMap的实现
# Java集合ConcurrentHashMap详解
# Java的ConcurrentHashMap原理深入分析
# Java ConcurrentHashMap如何合理指定初始容量
# 另外一个
# 还没
# 希望能
# 想让
# 谢谢大家
# 来实现
# 可以利用
# 那该
# 在某些
# TestServiceImpl
# public
# lt
# static
# private
# Long
# LockObj
# userId
# test
# tryLock
# lock
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251811 】
【
AI营销90571 】
相关推荐:
如何在建站主机中优化服务器配置?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
长沙企业网站制作哪家好,长沙水业集团官方网站?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
javascript中的try catch异常捕获机制用法分析
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
Laravel如何优化应用性能?(缓存和优化命令)
零基础网站服务器架设实战:轻量应用与域名解析配置指南
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
如何在 Pandas 中基于一列条件计算另一列的分组均值
太平洋网站制作公司,网络用语太平洋是什么意思?
如何快速上传建站程序避免常见错误?
Mybatis 中的insertOrUpdate操作
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
黑客如何通过漏洞一步步攻陷网站服务器?
javascript读取文本节点方法小结
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
网站制作软件有哪些,制图软件有哪些?
如何在万网开始建站?分步指南解析
高端建站如何打造兼具美学与转化的品牌官网?
无锡营销型网站制作公司,无锡网选车牌流程?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
如何用美橙互联一键搭建多站合一网站?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
EditPlus中的正则表达式 实战(2)
香港服务器如何优化才能显著提升网站加载速度?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
PythonWeb开发入门教程_Flask快速构建Web应用
如何获取免费开源的自助建站系统源码?
如何在云指建站中生成FTP站点?
高防服务器:AI智能防御DDoS攻击与数据安全保障
Linux安全能力提升路径_长期防护思维说明【指导】
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何用VPS主机快速搭建个人网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
如何安全更换建站之星模板并保留数据?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
微信h5制作网站有哪些,免费微信H5页面制作工具?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制

