ConcurrentSkipListSet并替换remove(键)



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

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

相关内容

  • 没有找到相关文章

最新更新