この投稿の概要:注文されたアイテムのセットがあり、その注文は時間の経過とともに変更される可能性があります。複数のスレッドからこのセットを反復処理できる必要があります。各スレッドは、アイテムの順序も更新する必要がある場合があります。
たとえば、複数のスレッドはString
、任意の並べ替えられた順序でキーにアクセスする必要があります。これらの文字列は、自然順序ではなく、変更される可能性のあるいくつかの値(したがって、カスタムComparator
)によって並べ替えられます。私の最初の実装は、を使用しTreeSet
て同期することでした。キーのいずれかを並べ替える必要がある場合、スレッドはマップからキーを削除し、比較値を更新して、キーを再挿入します。これを実装するために、キーはネイティブですString
が、コンパレータは値にアクセスできます。これは、キーの順序が時間の経過とともに変化する可能性がある奇妙な配置ですが、変更されたキーは常に削除され、変更されると再挿入されるため、機能しているように見えます。String
( sが別のオブジェクトにラップされている場合にも機能すると思います。)
私は最近、基本的にスレッドセーフなソートされたセット(またはマップ)であるConcurrentSkipListSet
/ConcurrentSkipListMap
実装に気付きました。データ構造全体をロックすることなく、キーを反復処理できるようになりました。ただし、上記で行った操作のように、キーをアトミックに削除して別のキーに置き換える方法はありますか?これにより、他の反復スレッドがアイテムを見逃さず、synchronize
ブロックを使用する必要がなくなります。
誰かがこのタイプの操作のためのより良いデータ構造を提案することができれば、私もすべての耳です!