ConcurrentSkipListSet и заменить удалить (ключ) - PullRequest
4 голосов
/ 24 июня 2011

Я использую ConcurrentSkipListSet, который заполняю 20 ключами.

Я хочу постоянно заменять эти ключи.Тем не менее, ConcurrentSkipListSet, похоже, не имеет функции атомарной замены.

Это то, что я сейчас использую:

    ConcurrentSkipListSet<Long> set = new ConcurrentSkipListSet<Long>();
    AtomicLong uniquefier = new AtomicLong(1);    

    public void fillSet() { 
    // fills set with 20 unique keys;
    }
    public void updateSet() {
        Long now = Calendar.getInstance().getTimeInMillis();
        Long oldestKey = set.first();
        if (set.remove(oldestKey)) {
            set.add(makeUnique(now));
        }
    }

    private static final long MULTIPLIER = 1024;

    public Long makeUnique(long in) {
        return (in*MULTIPLIER+uniquefier.getAndSet((uniquefier.incrementAndGet())%(MULTIPLIER/2)));
    }

Цель всей этой операции - сохранить список как можно дольшекак есть, и обновлять только заменой.updateSet вызывается примерно 100 раз за мс.

Теперь мой вопрос заключается в следующем: удаляет ли return true, если сам элемент присутствовал до (и не после), или метод возвращает true только если звонок действительно отвечал за удаление?То есть: если несколько потоков вызовут удаление для одного и того же ключа в одно и то же время, они / все / вернут истину или только одна вернет истину?

1 Ответ

3 голосов
/ 24 июня 2011

set.remove вернет true только для потока, который фактически вызвал удаление объекта.

Идея параллелизма набора состоит в том, что несколько потоков могут обновлять несколько объектов. Однако каждый отдельный объект может обновляться только одним потоком за раз.

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