【发布时间】:2021-04-04 11:10:33
【问题描述】:
我正在尝试使用
queue = new ConcurrentSkipListSet<Task>(Comparators.comparing(Task::priority))
作为具有唯一元素的并发优先级队列(参见类似的讨论here),但我需要不时更改任务的优先级。
很明显,改变元素的优先级当它们在集合中时就是打开一罐虫子;幸运的是,我只需要在将它们从queue 中删除之后并在重新提交它们之前更改它们的优先级。更准确地说,我使用pollFirst() 从queue 中弹出一个元素,我可能需要在更新其优先级(具有较低优先级)后重新提交。
如果这是一个串行实现,那么当元素在集合之外时更改它们的优先级应该没有问题。
在并发访问的情况下进行此更新的线程安全方式是什么? 是否足以保证
task = queue.pollFirst() 发生在task.priorityUpdate() 之前,发生在queue.add(task) 之前?
【问题讨论】:
-
这听起来对我来说已经足够了——我没有看到任何缺陷。显然,另一个线程可能会取出并使用您已决定降低优先级但尚未解决的元素(但我认为这不是您要问的)。
-
您的标题似乎与您的实际问题不符。
标签: java multithreading concurrency happens-before concurrentskiplistmap