介绍
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项目中使用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!