我想包装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/