Java trere是使用带有锁的concurrentmap的更简单的方法吗?
我有一个要求,每个实体ID中的某些函数中都有锁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
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();
}
}
}