4

我正在使用 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?

4

1 回答 1

3

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

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

于 2011-06-24T12:58:08.187 回答