Я использую 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 только если звонок действительно отвечал за удаление?То есть: если несколько потоков вызовут удаление для одного и того же ключа в одно и то же время, они / все / вернут истину или только одна вернет истину?