Java 如何包装ConcurrentSkipListSet,以线程安全的方式保持最新值的固定容量?
我希望包装以保持最新(根据)值的固定容量: 但是,此Java 如何包装ConcurrentSkipListSet,以线程安全的方式保持最新值的固定容量?,java,multithreading,concurrency,thread-safety,java.util.concurrent,Java,Multithreading,Concurrency,Thread Safety,Java.util.concurrent,我希望包装以保持最新(根据)值的固定容量: 但是,此put()不是线程安全的 注意:没有其他突变方法。当然,我需要像getLast()或getBefore(整数值)这样的“只读”方法 如何包装ConcurrentSkipListSet,以线程安全的方式保持最新值的固定容量 您不太可能做到这一点并获得ConcurrentSkipListSet的并发好处。此时,您最好只使用Collections.synchronizedNavigableSet(TreeSet),此时您可以编写 synchroniz
put()
不是线程安全的
注意:没有其他突变方法。当然,我需要像getLast()
或getBefore(整数值)
这样的“只读”方法
如何包装ConcurrentSkipListSet,以线程安全的方式保持最新值的固定容量
您不太可能做到这一点并获得
ConcurrentSkipListSet
的并发好处。此时,您最好只使用Collections.synchronizedNavigableSet(TreeSet)
,此时您可以编写
synchronized (set) {
set.add(value);
if (set.size() > cap) {
set.pollFirst();
}
}
如果不将整个过程封装在一个同步锁中,我不希望有任何方法可以做到这一点。您需要在集合上执行哪些其他变异方法?@jtahlborn没有其他变异方法。当然,我需要像
getLast()
或getBefore(整数值)
这样的访问方法。感谢您指出这个问题。@LouisWasserman这是否意味着我还必须将getLast()
或getBefore(Integer value)
等访问方法包装在与put(Integer value)
使用的同步锁相同的同步锁中,并且我将失去ConcurrentSkiplistSet的所有并发好处?是的,这将随之而来。此时,您最好使用Collections.synchronizedNavigableSet(TreeSet)
。我承认,如果有一种很好的方法可以做到这一点,并且仍然能够获得良好的并发效果,我会非常惊讶。
// This method should be atomic.
public void put(int value) {
intSet.add(value);
if (intSet.size() > capacity)
intSet.pollFirst();
}
synchronized (set) {
set.add(value);
if (set.size() > cap) {
set.pollFirst();
}
}