我正在使用 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 次。
现在,我的问题是:如果元素本身在之前(而不是之后)存在,remove 是否返回 true,或者仅当调用实际上负责删除时该方法才返回 true?即:如果多个线程同时在同一个键上调用remove,它们/all/会返回true,还是只有一个返回true?