2012-02-19 9 views
6

スレッドセーフでなければならない共有マップデータ構造があります。マップを読み込んだり、マップに追加する最も効率的な方法は同期されていますか?データ構造をスレッドセーフ(Java)にする最も効率的な方法

ありがとうございます!

編集:データ構造は更新不可能なキャッシュです。つまり、一度データがいっぱいになるとキャッシュが更新されません。だから、最初はいくつかの書き込みで大量の書き込みが行われていますが、多くは読み込みになります

答えて

6

「最も効率的です」というのは相対的なもので、状況によって異なります。多くのスレッドがマップで同時に動作することが予想される場合は、ConcurrentHashMapのようなものを考慮してください。スレッドセーフですが、HashtableまたはCollections.synchronizedMap()とは異なり、同時アクセスが可能です。

0

同期されたメソッドやコレクションは確実に動作します。これは最も効率的なアプローチではありませんが、実装が簡単で、1秒間に数百万回の構造にアクセスしない限り、オーバーヘッドに気付かないでしょう。

ConcurrentHashMapを使用してもよい場合がありますが、これは最初から並行処理用に設計されており、非常に並行した状況でさらに優れたパフォーマンスを発揮するはずです。

3

これはアプリでどのように使用するかによって異なります。

あなたが読み、それに書き込み、ConcurrentHashMapをたくさんやっている場合は、それはほとんどあなたが、書き込みは一般的ではありませんので、ReadWriteLock を(使用して、コレクション内にラップ共通地図を読んでいる場合は、おそらく最良の選択であります書き込み時には高速アクセスとロックが得られます)。

Collections.synchronizedMap()は、最悪の場合です。すべてのメソッドを同期させたラッパーを提供することができます。

1

特定の使用例(更新不可能なキャッシュ)の場合、書き込みマップのコピーは同期マップとConcurrentHashMapの両方より優れています。

参照先:https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap(私は、Apacheには書き込みマップの実装にもコピーがあると思います)。

+0

リンクが - https://bitbucket.org/atlassian/atlassian-util-concurrent/wiki/CopyOnWrite%20Mapsに変更されたようです –

関連する問題