Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何包装ConcurrentSkipListSet,以线程安全的方式保持最新值的固定容量?_Java_Multithreading_Concurrency_Thread Safety_Java.util.concurrent - Fatal编程技术网

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();
  }
}