- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用
queue = new ConcurrentSkipListSet<Task>(Comparators.comparing(Task::priority))
作为具有独特元素的并发优先级队列(参见类似的讨论 here ),但我需要不时更改任务的优先级。
显然,在集合中时更改元素的优先级无异于打开一堆蠕虫;幸运的是,我只需要在将它们从 queue
中删除后更改它们的优先级,并在重新提交之前。更准确地说,我使用 pollFirst()
从 queue
弹出一个元素,我可能需要在更新其优先级(优先级较低)后重新提交。
如果这是一个串行实现,当元素在集合之外时更改元素的优先级应该没有问题。
通过并发访问执行此更新的线程安全方式是什么?是否足以保证
task = queue.pollFirst()
发生在 task.priorityUpdate()
之前, 发生在 queue.add(task)
之前?
最佳答案
所有并发集合在元素放置和元素获取之间建立先行关系。
问题是,如果您需要在队列中更改优先级,然后将它们取出并放回队列中,因为这是唯一的方法;然后,并发线程可能同时放置相同的元素,然后您将丢失修改。在这种情况下,将需要进一步同步。
但是,如果您要取出元素,更改它们的优先级,然后才评估是否应该将它们放回原处,并发集合的 happen-before 保证足以确保正确性,您无需执行任何其他操作。
从add()
到pollFirst()
存在happens-before关系,所以在调用add()
的线程中创建的对象> 对调用 pollFirst()
的线程可见。
从 pollFirst()
到 add()
没有。但是,如果您更改优先级,然后从同一线程调用 add()
,则不需要进一步的内存限制。
如果稍后从另一个线程调用 pollFirst()
,add()
和 pollFirst()
之间的先行关系将保证更新到调用 add()
之前的对象是可见的。
关于java - 与 ConcurrentSkipListSet 一起正常工作的即时比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65464750/
我有一个 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
我是一名优秀的程序员,十分优秀!