全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java 使用ConcurrentHashMap和计数器实现锁

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小时内与您取得联系。