我正在使用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?
set.remove
只会为实际导致对象被删除的线程返回true。
集合并发背后的思想是多个线程可以更新多个对象。但是,每个单独的对象一次只能由一个线程更新。