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自定义中间件实现权限控制