ConcurrentSkipListSet并替换remove(key)

时间:2011-06-24 10:33:56

标签: java concurrency replace atomic concurrent-collections

我正在使用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,还是只返回一个?

1 个答案:

答案 0 :(得分:3)

set.remove只会对实际导致删除该对象的线程返回true。

集合并发背后的想法是多个线程可以更新多个对象。但是,每个单独的对象一次只能由一个线程更新。