2011-09-11 12 views
2

私はプライベートHashMapを持っていて、私はそれにCollections.synchronizedMap()を使用しています。 APIは、マップが反復されるときに実際には「スレッドセーフ」ではないと言います。私は通常マップを反復するためにMap.entrySet()を使用していますので、マップにはAPIのような手動同期ブロックが必要です。しかし、私はマップの参照を同期させることはできません。プライベートなので....私は実際のマップ参照(おそらくこれは良いOOPの設計ではない)にゲッターを提供する必要がありますか、または深いコピーを返す地図の? (これは遅いかもしれない)。私はこのような状況になる最良の方法は何か分かりません。誰かが何らかのアイデアを出したり、このような状況に直面する最も典型的な方法を教えてもらえますか?外部からのHashMapへのアクセスの同期

答えて

3

実際にHashMapに同時にアクセスする必要がある場合は、ConcurrentHashMapを使用することを強くお勧めします。これは、Java 5以降のutil.concurrentパッケージの一部です。これは、同期化されたラッパーよりもマルチスレッド環境で優れたパフォーマンスを発揮します。

マップの作成方法(サードパーティのライブラリにある可能性があります)を制御できない場合は、そのマップを反復処理するときにアクセスを同期させる必要があります。詳細については、Collections.synchronizedMapのJavaDocsを参照してください。 APIドキュメントに含まれるサンプルコードを次に示します。

Map m = Collections.synchronizedMap(new HashMap()); 
     ... 
    Set s = m.keySet(); // Needn't be in synchronized block 
     ... 
    synchronized (m) { // Synchronizing on m, not s! 
     Iterator i = s.iterator(); // Must be in synchronized block 
     while (i.hasNext()) 
      foo(i.next()); 
    } 
+0

私はConcurrentHashMapについて考えましたが、実際には時にはマップに同時にアクセスするいくつかのスレッドで作業する必要がありますか? – Wyvern666

+0

@ Wyvern666私はConcurrentHashMapをCollections.synchronizedMapよりも多くのスレッドがマップにアクセスできるすべての場合に使用します。私は理由がないとは思わない。 –

+0

同期はマップ参照には含まれませんが、参照はプライベートです。どのように反復するとき、別のクラスからそれを同期させるのですか? – Wyvern666

関連する問題