ConcurrentHashMap如何在java项目中使用

  介绍

ConcurrentHashMap如何在java项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强> java使用ConcurrentHashMap

在某些场景下,我们想让线程根据某些业务数据进行排队,简单代码如下:

进口java.util.ArrayList;
  进口java.util.HashMap;
  进口并不知道;
  进口java.util.Map;
  进口java.util.concurrent.ConcurrentHashMap;
  进口java.util.concurrent.atomic.AtomicInteger;
  
  公开课TestServiceImpl {
  私有静态ConcurrentHashMap<长,LockObj>lockMap=new ConcurrentHashMap<长,LockObj> (40);
  
  公共空白测试(长userId) {
  LockObj锁=tryLock (userId);
  同步(锁){
  尝试{//处理业务
  }
  最后{
  解锁(锁);
  }
  }
  }
  
  私人LockObj tryLock(长键){
  LockObj curVal=new LockObj(关键);
  LockObj普雷瓦尔=lockMap。curVal putIfAbsent(关键);
  如果(null==preVal) {
  curVal.inc ();
  返回curVal;
  }
  其他{
  preVal.inc ();
  }
  返回普雷瓦尔;
  }
  
  私人空间解锁(LockObj锁){
  如果(lock.dec () & lt;=0) {
  lockMap.remove (lock.getKey ());
  }
  }
  
  公开课LockObj {
  私人长键=0;
  私人AtomicInteger数=new AtomicInteger (0);
  
  公共LockObj(长键){
  这一点。键=键;
  }
  
  公共int inc () {
  返回count.incrementAndGet ();
  }
  公共int 12月(){
  返回count.decrementAndGet ();
  }
  
  公共长getKey () {
  返回键;
  }
  
  @Override
  公共字符串toString () {
  返回“LockObj[关键=?+键+“,数=?+数+“]”;
  }
  }
  
  }

按照标识来排队,如果每个线程处理数据后不释放锁的话,那么可以不利用计数器。但是加了释放锁的操作,则必须加上计算器。因为当线程把锁释放掉后,还没来得及退出同步的代码块时,另外一个线程调用了tryLock方法,那该线程将拿到另外一个对象的锁,导致利用同步关键字进行userId排队失败。

也可以利用番石榴的API来实现。

进口com.google.common.collect.Interner;
  进口com.google.common.collect.Interners;
  
  
  公开课TestServiceImpl {
  
  Interner池=Interners.newWeakInterner ();
  
  公共空白测试(长userId)抛出OspException {
  
  同步(pool.intern (String.valueOf (userId))) {//处理业务操作
  }
  }
  }

看完上述内容,你们掌握ConcurrentHashMap如何在java项目中使用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

ConcurrentHashMap如何在java项目中使用