3

Java の Collections Framework のほとんどのクラスは、デフォルトでは非同期ですが、スレッドセーフにする必要がある場合は、同期するクラスにすることができます。同期にはパフォーマンスのペナルティがあるため、スレッドセーフである必要のないものを書いている場合は、非同期バージョンを使用する方がよいでしょう。

しかし、ConcurrentSkipListMapこのスキームには従いません。非同期バージョンはありません。SkipListMapCollections Framework の残りの部分に沿って、スレッド セーフを必要としないアプリケーション用のより高速な unsynchronized がないのはなぜですか?

私が考えることができるのは、Skip List の最も単純な実装はすでにスレッドセーフであるため、同期バージョンを使用してもパフォーマンスが低下することはないということだけです。これにはある程度の意味がありますが、ソース コードを調べても、それはまったくわかりません。コードにブロックはありませんがsynchronized、Javadoc は

このクラスは、SkipLists の並行バリアントを実装します...

これは、アルゴリズムを変更してスレッドセーフにするのが面倒であることを示唆しています。後で、私たちは読んだ

これらのリストの基本的な考え方は、同時挿入との競合を避けるために、削除時に削除されたノードの「次の」ポインタをマークすることです...

また、何らかのオーバーヘッドが関係しているようにも聞こえます。

このオーバーヘッドが非常に小さいため、非スレッドセーフにする価値がないというだけSkipListMapですか?

4

2 に答える 2

-2

ConcurrentSkipListMap は、CAS 操作に基づくロックレス実装です。理論的には、単一のスレッドでのみ使用する場合、パフォーマンスのペナルティを支払う必要はありません。同期はありません。実装をブロックする代わりに競合がある場合、競合を解決するために基本的にループします。競合がない場合、ループはありません。

于 2014-11-13T20:13:26.360 に答える