我想包装ConcurrentSkipListSet以保持最新(根据Comparator)值的固定容量:

private int capacity = 100;
// using Integer just for an illustration
private ConcurrentSkipListSet<Integer> intSet = new ConcurrentSkipListSet<>();

因此,我像这样实现了put():
// This method should be atomic.
public void put(int value) {
    intSet.add(value);
    if (intSet.size() > capacity)
        intSet.pollFirst();
}

但是,此put()并非线程安全的。

注意:没有其他突变方法。当然,我需要像getLast()getBefore(Integer value)这样的“只读”方法。

最佳答案

您不可能做到这一点并获得ConcurrentSkipListSet的并发优势。那时,您最好只使用Collections.synchronizedNavigableSet(TreeSet),此时您可以编写

synchronized (set) {
  set.add(value);
  if (set.size() > cap) {
    set.pollFirst();
  }
}

关于java - 如何包装ConcurrentSkipListSet以线程安全的方式保持最新值的固定容量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34468302/

10-11 00:41