ConcurrentSkipListSetはいつ役に立ちますか?


84

Java 6 APIでこのデータ構造を見たばかりですが、いつ役立つリソースになるのか知りたいです。私はscjp試験の勉強をしていますが、それについて言及している模擬試験の質問を見たにもかかわらず、キャシー・シエラの本でそれがカバーされているのを見ていません。

回答:


175

ConcurrentSkipListSetConcurrentSkipListMapは、複数のスレッドによってアクセスされるソートされたコンテナーが必要な場合に役立ちます。これらは基本的に、並行コードのTreeMapおよびTreeSetと同等です。

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

現在、Javaには赤黒木ベースの同時マップ/セット実装はありません。文献を少し調べて、同時RBツリーがスキップリストよりも優れていることを示すいくつかの 論文を見つけましたが、これらのテストの多くはトランザクションメモリを使用して行われ、現時点では主要なアーキテクチャのハードウェアではサポートされていません。

実装がよく知られていて、ロックフリーにするのが簡単でポータブルだったので(CASを使用して)、JDKの人たちはここでスキップリストを使用したと思います。誰かが明確にすることを気にかけているなら、してください。私は興味がある。


1
マルチスレッド環境で一意のレコードをパフォーマンスの高い方法で追跡する場合にも役立ちます。
anataliocs 2017年

4

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

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


2

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.