gpt4 book ai didi

java - 有没有更简单的方法来使用并发映射锁?

转载 作者:行者123 更新时间:2023-11-30 03:01:06 25 4
gpt4 key购买 nike

我需要在每个实体 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();
}
}
}

有没有办法运行 Lock lock = returnExistingOrPutAndReturnNew( id, newLock ); 来摆脱 null 检查?

最佳答案

不可以,ConcurrentMap中没有这个方法,但是可以使用guava LoadingCache :

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();
}
}
}

更新:

在java 8中你可以使用Map#computeIfAbsent方法:

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

关于java - 有没有更简单的方法来使用并发映射锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35944919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com