gpt4 book ai didi

java - 在 ConcurrentSkipListMap/ConcurrentSkipListSet 中重新排序键的原子方法?

转载 作者:行者123 更新时间:2023-12-04 05:06:08 26 4
gpt4 key购买 nike

这篇文章的摘要:我有一组订购的物品,它们的顺序可能会随着时间的推移而改变。我需要能够从多个线程遍历这个集合,每个线程可能还想更新项目的顺序。

比如多个线程需要访问String以某种任意排序顺序的键。它们的字符串不是根据它们的自然顺序排序,而是根据一些可能会改变的值(因此,自定义 Comparator )。我最初的实现是使用 TreeSet并同步它。如果任何键需要重新排序,线程将从映射中删除键,更新比较值,然后重新插入键。为了实现这一点, key 是本地的 String s,但比较器可以访问这些值。这是一种奇怪的安排,其中键的顺序可能会随着时间的推移而改变,但是由于更改的键总是在更改时被删除并重新插入,因此它似乎有效。 (我想如果 String 被包裹在另一个对象中,它也可以工作。)

我最近才知道 ConcurrentSkipListSet/ConcurrentSkipListMap基本上是线程安全的排序集(resp.maps)的实现。看起来我现在可以遍历键而不必锁定整个数据结构。但是,有没有一种方法可以使用它们以原子方式删除一个键并将其替换为另一个键,就像我上面所做的操作一样,这样其他迭代线程就不会错过该项目,而不必使用 synchronize块?

如果有人可以为这种类型的操作提出更好的数据结构,我也很听话!

最佳答案

is there a way I can use them to atomically remove a key and replace it with another, like the operation I was doing above, so that other iterating threads don't miss the item, and without having to use synchronize blocks?



简短的回答是否定的。如果您需要删除并重新插入,我所知道的任何集合都没有原子方法可以做到这一点。

也就是说,一种可能性是您在将其从跳过列表中删除之前重新插入该项目。这会导致重复,但可能比丢失条目更容易处理。您可以在更改对象后重新插入它,以便它的排序方式有所不同。这假设对象也将不相等。但是,如果正在处理列表的其他线程无法处理重复项,那么我认为您是 SOL。

关于java - 在 ConcurrentSkipListMap/ConcurrentSkipListSet 中重新排序键的原子方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15507418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com