- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要一个非常快速(插入、删除、包含)的高度并发 列表,它可以使用比较器/可比较对象进行排序。
现有的 ConcurrentSkipListSet 将是理想的,如果它是一个列表而不是一个集合。我需要将多个相等的项目插入到数据结构中。
如果我找不到更好的东西,我目前正在考虑使用 LinkedDeque,但这种结构在高争用情况下比跳表慢得多。
有什么建议吗?
编辑:我真正需要的,最低限度,是使用 compareTo 排序的东西,可以同时插入,并且可以使用对象标识删除/获取项目。评论中提到的所有其他并发要求仍然适用。
最佳答案
The existing ConcurrentSkipListSet would be ideal, if it was a list and not a set.
所以 SkipList data-structure它的核心是一个链表。如果您担心顺序以及轻松有序地遍历它的能力,SkipList 也可以很好地解决这个问题。它也是平衡树的概率替代方案,这就是为什么它也可以是 Set
或 Map
的原因。内存中的数据结构如下所示:
引用自 Javadocs:
This class implements a concurrent variant of SkipLists providing expected average log(n) time cost for the containsKey, get, put and remove operations and their variants. Insertion, removal, update, and access operations safely execute concurrently by multiple threads. Iterators are weakly consistent, returning elements reflecting the state of the map at some point at or since the creation of the iterator. They do not throw ConcurrentModificationException, and may proceed concurrently with other operations. Ascending key ordered views and their iterators are faster than descending ones.
如果您详细说明您希望List
具有哪些功能,我可以更好地回答ConcurrentSkipListSet
是否能够工作。
编辑:
啊,我明白了。在评论中反复讨论之后,您似乎需要能够将两个等效的对象粘贴到 Set
中,这是不可能的。我们的工作是永远不要让 compareTo(...)
返回 0。这有点 hack,但是使用 AtomicLong
为每个对象生成一个唯一的数字,你然后可以在实际比较字段(在本例中为数字超时值)相等时比较这些数字。这将允许将具有相同字段的对象插入到 Set
中,并根据字段以正确的顺序保存。
关于java - 并发跳过列表?也就是说,不是 ConcurrentSkipListSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18594446/
我有一个 ConcurrentSKipListSet ,我正在用 for-each 迭代这个集合中的值循环。 另一个线程在某个时候将从这个集合中删除一个元素。 我想我遇到了这样一种情况:一个线程删除了
问题:ConcurrentSkipListSet(csls) 的 contains 和 add 的文档声明如下: 公共(public) boolean 添加(E e)如果指定元素尚不存在,则将其添加到
据我了解,ConcurrentSkipListSet 的平均复杂度为 O(log n),用于插入、搜索和删除元素,最坏情况为 O(n)。如何访问第一个和最后一个元素?它比日志低吗?我看到它保留了一个指
我刚刚在 Java 6 API 上看到了这个数据结构,我很好奇它什么时候会成为有用的资源。我正在为 scjp 考试而学习,但我没有看到 Kathy Sierra 的书涵盖了它,尽管我看过提到它的模拟考
我正在尝试使用 queue = new ConcurrentSkipListSet(Comparators.comparing(Task::priority)) 作为具有独特元素的并发优先级队列(参见
在迭代 ConcurrentSkipListSet 时删除和添加元素是否安全: ConcurrentSkipListSet set = new ConcurrentSkipListSet(myComp
我正在使用 ConcurrentSkipListSet 集合来处理并发运算符。我发现它有时会卡住,用以下代码重现: import java.util.Comparator import java.ut
我想包装 ConcurrentSkipListSet保持最新的固定容量(根据 Comparator )值: private int capacity = 100; // using Integer j
我不确定 java.util.concurrent.ConcurrentSkipListSet 是否存在问题?我正在尝试将一些对象添加到 ConcurrentSkipListSet (由我自己的比较器
我正在尝试维护 ConcurrentSkipListSet 中的插入顺序。正在添加的项目是具有 value(String) 和 index (int) 属性的自定义类类型。它实现了 Comparabl
我正在使用一个 ConcurrentSkipListSet,它显然是通过多个线程访问的。现在,底层对象的 compareTo 方法使用的值会随着时间的推移而改变。因此,我想“更新”列表的顺序(通过求助
这篇文章的摘要:我有一组订购的物品,它们的顺序可能会随着时间的推移而改变。我需要能够从多个线程遍历这个集合,每个线程可能还想更新项目的顺序。 比如多个线程需要访问String以某种任意排序顺序的键。它
我正在使用 ConcurrentSkipListSet 并使用 contains 方法。 根据包含方法的 JAVA 文档 如果此集合包含指定元素,则返回 true。更正式地说,当且仅当此集合包含满足
我需要一个非常快速(插入、删除、包含)的高度并发 列表,它可以使用比较器/可比较对象进行排序。 现有的 ConcurrentSkipListSet 将是理想的,如果它是一个列表而不是一个集合。我需要将
我理解的唯一区别是迭代器之间。 SkipList有 弱一致 , 而 TreeSet有 快速失败 .除此之外,我在 SkipList 中看不到任何同步方法。 (虽然它在 Concurrent 包中)。
我想要一组并发的字符串值,按长度最长 -> 最短排序。 这是我的代码(JAVA 8): private ConcurrentSkipListSet sortedSourceTypeNames = ne
等待ConcurrentSkipListSet修复( http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8060435 ),我的大脑无法尝试找到解
我正在考虑将一些使用 java.util.concurrent.ConcurrentSkipListSet 的代码移植到此类不可用的环境(特别是 android 2.2)。因此,我正在寻找它的替代品。
我在 ConcurrentSkipListSet 上使用 descendingIterator 方法。我刚刚查看了文档并注意到以下评论: “升序 View 及其迭代器比降序 View 更快。” 参见
通常,并发集合可以安全地进行迭代;根据 Javadoc 的说法:'迭代器是弱一致的,返回的元素反射(reflect)了在迭代器创建时或自创建迭代器后的某个时刻集合的状态。它们不会抛出 Concurre
我是一名优秀的程序员,十分优秀!