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
相关文章:
招商网站制作流程,网站招商广告语?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
如何快速搭建自助建站会员专属系统?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
宿州网站制作公司兴策,安徽省低保查询网站?
高防服务器如何保障网站安全无虞?
如何高效完成自助建站业务培训?
如何批量查询域名的建站时间记录?
如何通过西部建站助手安装IIS服务器?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何在万网开始建站?分步指南解析
如何选择美橙互联多站合一建站方案?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
内部网站制作流程,如何建立公司内部网站?
定制建站策划方案_专业建站与网站建设方案一站式指南
建站之星展会模板:智能建站与自助搭建高效解决方案
,怎么用自己头像做动态表情包?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何在服务器上三步完成建站并提升流量?
如何快速配置高效服务器建站软件?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
中山网站推广排名,中山信息港登录入口?
建站之家VIP精选网站模板与SEO优化教程整合指南
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
网站制作模板下载什么软件,ppt模板免费下载网站?
香港服务器租用费用高吗?如何避免常见误区?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
行程制作网站有哪些,第三方机票电子行程单怎么开?
装修招标网站设计制作流程,装修招标流程?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何快速搭建响应式可视化网站?
大连网站制作公司哪家好一点,大连买房网站哪个好?
C#如何使用XPathNavigator高效查询XML
如何在景安服务器上快速搭建个人网站?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
如何用AWS免费套餐快速搭建高效网站?
php json中文编码为null的解决办法
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
微课制作网站有哪些,微课网怎么进?
如何在万网主机上快速搭建网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
,购物网站怎么盈利呢?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
孙琪峥织梦建站教程如何优化数据库安全?
如何快速查询域名建站关键信息?
建站之星如何实现PC+手机+微信网站五合一建站?
小型网站制作HTML,*游戏网站怎么搭建?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
*请认真填写需求信息,我们会在24小时内与您取得联系。