web-dev-qa-db-ja.com

ConcurrentSkipListSetはいつ便利ですか?

Java 6 APIでこのデータ構造を見たばかりで、いつ役に立つリソースになるのか興味があります。scjp試験のために勉強していますが、見当たりませんKathy Sierraの本では、それについて言及した模擬試験の質問を見たことがありますが。

76
andandandand

ConcurrentSkipListSet および ConcurrentSkipListMap は、複数のスレッドからアクセスされるソートされたコンテナが必要な場合に便利です。これらは本質的に、並行コードのTreeMapとTreeSetに相当します。

JDK 6の実装は、IBMのMaged Michaelによる 高性能動的ロックフリーハッシュテーブルおよびリストベースのセット に基づいています。これは、スキップリストにアトミックに多くの操作を実装できることを示しています- 比較およびスワップ(CAS) 操作。これらはロックフリーであるため、これらのクラスを使用するときにsynchronized(ほとんどの操作の場合)のオーバーヘッドを心配する必要はありません。

現在、 Red-Black tree Javaでの並行Map/Set実装はありません。文献を少し調べてみると、 couplepapers があり、スキップリストよりも優れた並行RBツリーを示していましたが、これらのテストの多くは transactional memory 。これは現在、主要なアーキテクチャのハードウェアではサポートされていません。

実装がよく知られており、ロックフリーにすることは簡単で移植性がある(CASを使用する)ため、ここではJDKの担当者がスキップリストを使用したと考えています。誰かが明確にしたい場合は、してください。私は興味がある。

161
Todd Gamblin

スキップリストはソートされたリストであり、log(n)のパフォーマンスで効率的に変更できます。その点では、TreeSetのようなものです。ただし、ConcurrentTreeSetはありません。私が聞いたのは、スキップリストの実装は非常に簡単だということです。それがおそらく理由です。

とにかく、並列でソートされた効率的なセットが必要な場合は、ConcurrentSkipListSetを使用できます

3
irreputable

これらは、複数のスレッドが同時に安全にアクセスできるセットが必要な場合に便利です。また、一貫性が弱いため、適切なパフォーマンスが得られます。Setを繰り返し処理しているときに挿入を安全に行うことができますが、Iteratorがその挿入を認識するという保証はありません。

2
Kaleb Brasee

ConcurrentSkipListMapは、自家製のキャッシュにレプリケーションレイヤーを実装する必要があるときに素晴らしい発見でした。 Mapアスペクトはキャッシュを実装し、基礎となるListアスペクトにより、オブジェクトがキャッシュに出現した順序を追跡できます。このリストの「スキップ」の側面により、リスト内の1つのスポットからオブジェクトを削除し、キャッシュ内で置換されたときに最後までオブジェクトをバンプすることが効率的になりました。

1
Patrick Rusk