Java の Collections Framework のほとんどのクラスは、デフォルトでは非同期ですが、スレッドセーフにする必要がある場合は、同期するクラスにすることができます。同期にはパフォーマンスのペナルティがあるため、スレッドセーフである必要のないものを書いている場合は、非同期バージョンを使用する方がよいでしょう。
しかし、ConcurrentSkipListMap
このスキームには従いません。非同期バージョンはありません。SkipListMap
Collections Framework の残りの部分に沿って、スレッド セーフを必要としないアプリケーション用のより高速な unsynchronized がないのはなぜですか?
私が考えることができるのは、Skip List の最も単純な実装はすでにスレッドセーフであるため、同期バージョンを使用してもパフォーマンスが低下することはないということだけです。これにはある程度の意味がありますが、ソース コードを調べても、それはまったくわかりません。コードにブロックはありませんがsynchronized
、Javadoc は
このクラスは、SkipLists の並行バリアントを実装します...
これは、アルゴリズムを変更してスレッドセーフにするのが面倒であることを示唆しています。後で、私たちは読んだ
これらのリストの基本的な考え方は、同時挿入との競合を避けるために、削除時に削除されたノードの「次の」ポインタをマークすることです...
また、何らかのオーバーヘッドが関係しているようにも聞こえます。
このオーバーヘッドが非常に小さいため、非スレッドセーフにする価値がないというだけSkipListMap
ですか?