java语言 百分网手机站

java使用ConcurrentHashMap和计数器实现锁的方法

时间:2020-08-17 16:43:47 java语言 我要投稿

java使用ConcurrentHashMap和计数器实现锁的方法

  java如何使用ConcurrentHashMap和计数器实现锁?下面是由百分网小编为大家整理的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和计数器实现锁的方法】相关文章:

JAVA实现生成GUID的方法12-04

关于Java动态实现的方法11-22

java使用动态代理来实现AOP11-22

java的split方法使用范例12-04

Java使用方法集锦11-26

java函数使用方法11-19

使用Java的枚举类型的方法11-26

Java编程中throw和throws子句的使用方法11-26

PHP文件锁与进程锁的实现06-20

Java for循环语句的使用方法12-05