ConcurrentHashMap
не предоставляет возможности условно удалить элемент и получить его.Итак, я реализую это самостоятельно:
private final ConcurrentHashMap<UUID, MyClass> map = new ConcurrentHashMap<>();
public MyClass removeIfAndGet(UUID key){
final MyClass[] arr = new MyClass[1];
return map.computeIfPresent(key, (x, v) -> {
if(v.isDone()){ // MyClass::isDone is thread-safe
arr[0] = v; // let's capture (steal) it!
return null; // let's remove it from a map!
}
return v; // v does not satisfy our requirement, don't remove that.
});
}
Это нормально?У меня есть некоторые сомнения из-за нехорошей "кражи" ссылки перед ее удалением.Это безопасно и правильно (также с точки зрения многопоточности?).Да, я знаю, что MyClass
должен быть сам по себе потокобезопасным.
PS Могу ли я сделать это лучше?