首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用线程安全的方式包装ConcurrentSkipListSet以保持最新值的固定容量?

如何用线程安全的方式包装ConcurrentSkipListSet以保持最新值的固定容量?
EN

Stack Overflow用户
提问于 2015-12-26 03:44:03
回答 1查看 301关注 0票数 2

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

代码语言:javascript
运行
复制
private int capacity = 100;
// using Integer just for an illustration
private ConcurrentSkipListSet<Integer> intSet = new ConcurrentSkipListSet<>();

因此,我实现了这样的put()

代码语言:javascript
运行
复制
// 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以保持最新值的固定容量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-26 04:09:28

您不太可能做到这一点,并获得ConcurrentSkipListSet的并发好处。在这种情况下,您最好使用Collections.synchronizedNavigableSet(TreeSet),此时您只需编写

代码语言:javascript
运行
复制
synchronized (set) {
  set.add(value);
  if (set.size() > cap) {
    set.pollFirst();
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34468302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档