Java trere是使用带有锁的concurrentmap的更简单的方法吗?

Java trere是使用带有锁的concurrentmap的更简单的方法吗?,java,concurrency,java.util.concurrent,Java,Concurrency,Java.util.concurrent,我有一个要求,每个实体ID中的某些函数中都有锁 private final ConcurrentMap<Long, Lock> idLocks = Maps.newConcurrentMap(); public void doSmth(Long id){ ReentrantLock newLock = new ReentrantLock(); Lock lock = prLocks.putIfAbsent( id, newLock ); //returns null

我有一个要求,每个实体ID中的某些函数中都有锁

private final ConcurrentMap<Long, Lock> idLocks = Maps.newConcurrentMap();

public void doSmth(Long id){
    ReentrantLock newLock = new ReentrantLock();
    Lock lock = prLocks.putIfAbsent( id, newLock ); //returns null for first run for this id
    if (null == lock) { //have to do null checking 
        lock = newLock;
    }
    if (lock.tryLock()){
        try {
        //some code here
        } finally {
            lock.unlock();
        }
    }
}
private final ConcurrentMap idLocks=Maps.newConcurrentMap();
公共无效doSmth(长id){
ReentrantLock newLock=新的ReentrantLock();
Lock Lock=prLocks.putIfAbsent(id,newLock);//此id的第一次运行返回null
如果(null==lock){//必须执行null检查
lock=newLock;
}
if(lock.tryLock()){
试一试{
//这里有一些代码
}最后{
lock.unlock();
}
}
}

是否有方法运行
Lock Lock=returnExistingOrPutAndReturnNew(id,newLock)
要消除空检查?

否,ConcurrentMap中没有此类方法,但您可以使用:

似乎是的
private final LoadingCache<Long, Lock> idLocks = CacheBuilder.newBuilder()
       .build(
             new CacheLoader<Long, Lock>() {
                   public Lock load(Long id) throws AnyException {
                       return new ReentrantLock();
                   }
             });

public void doSmth(Long id){
     Lock lock = prLocks.get(id); //always return not-null Lock
     if (lock.tryLock()){
          try {
             //some code here
          } finally {
             lock.unlock();
          }
     }
 }
public void doSmth(Long id){
    Lock lock = prLocks.computeIfAbsent(id, key -> new ReentrantLock());
    if (lock.tryLock()){
        try {
            //some code here
        } finally {
            lock.unlock();
        }
    }
}