我正在尝试使用
queue = new ConcurrentSkipListSet<Task>(Comparators.comparing(Task::priority))
作为具有唯一元素的并发优先级队列(请参阅此处的类似讨论),但我需要不时更改任务的优先级。
显然,改变元素在集合中的优先级就像打开一罐蠕虫;幸运的是,我只需要在将它们从queue
中删除之后以及重新提交它们之前更改它们的优先级。更准确地说,我用来pollFirst()
从 中弹出一个元素queue
,我可能需要在更新其优先级(具有较低优先级)后重新提交。
如果这是一个串行实现,那么在元素位于集合之外时更改元素的优先级应该没有问题。
使用并发访问进行此更新的线程安全方式是什么? 是否足以保证
task = queue.pollFirst()
以前发生过task.priorityUpdate()
,以前发生过queue.add(task)
?