Кража ссылки из ConcurrentHashMap перед ее удалением.правильность - PullRequest
0 голосов
/ 04 октября 2018

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 Могу ли я сделать это лучше?

1 Ответ

0 голосов
/ 04 октября 2018

Почему бы вам не создать свою собственную реализацию ConcurrentHashMap путем переопределения метода computeIfPresent() и получения от него текущего отображения, если оно есть.Затем вызовите супер реализацию (которая вызывает родительский метод computeIfPresent) и, если он возвращает ноль, верните полученное отображение.

Вы можете посмотреть , как реализован computeIfPresent и сделайте нечто подобное в вашем собственном методе computeIfPresent, но вместо этого верните то, что вы хотите.Это все еще может быть потокобезопасным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...