我正在使用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)));
}
整个操作的目标是保持列表的长度,并且只能通过替换来更新。每个ms调用updateSet大约100次。
现在,我的问题是:如果元素本身在之前(而不是之后)存在,则删除返回true,或者如果调用实际负责,方法是否返回true 删除? 即:如果多个线程同时在同一个键上调用remove,它们/ all /将返回true,还是只返回一个?
答案 0 :(得分:3)
set.remove
只会对实际导致删除该对象的线程返回true。
集合并发背后的想法是多个线程可以更新多个对象。但是,每个单独的对象一次只能由一个线程更新。