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 は 1 ミリ秒あたり約 100 回呼び出されます。

ここで、私の質問は次のとおりです。要素自体が以前に存在していた場合 (後に存在していない場合)、remove は true を返しますか、それとも呼び出しが実際に削除の原因であった場合にのみメソッドは true を返しますか? つまり、複数のスレッドがまったく同じキーに対して同時に remove を呼び出した場合、それらは /all/ が true を返すのでしょうか、それとも 1 つだけが true を返すのでしょうか?

4

1 に答える 1

3

set.remove実際にオブジェクトが削除されたスレッドに対してのみ true を返します。

セットの同時実行の背後にある考え方は、複数のスレッドが複数のオブジェクトを更新できるということです。ただし、個々のオブジェクトは、一度に 1 つのスレッドによってのみ更新できます。

于 2011-06-24T12:58:08.187 に答える