3

さまざまなスレッドからの読み取り (読み取りのみ) に使用されるプライベート LinkedHashMap があります。

class foo {

  private LinkedHashMap map = ...;


  public publicMethodCalledFromDifferentThreads() {

     for (Object foo : map) {
        ...
     }
  }
}

この実装はスレッド セーフではないため、forループは正しく動作しません。私は自分で解決策を見つけようとしましたが、思いついたのは次のことだけです。

class foo {

  private LinkedHashMap map = ...;
  private Map.Entry[] mapEntries = map.entrySet().toArray() ...;

  public publicMethodCalledFromDifferentThreads() {

     for (int i = 0; i < mapEntries.length; i++) {
        mapEntries[i]...
        ...
     }
  }
}

したがって、最終的には 2 つの変数が必要になり、反復が非常に複雑になります。これを行うための最も良い方法は何でしょうか?

ありがとう!

4

2 に答える 2

3

リストとリスト内のものの両方を読んでいるだけで、基になるオブジェクトが変更されていない場合、スレッドの問題はないはずです。

実際にどのような問題が発生していますか?

LinkedHashMap を何らかの形で変更している可能性があると思います。

さらに、スレッドが飛び回っていることをどのように判断していますか? 各スレッドが順番に反復しているにもかかわらず、2 つのスレッドからの出力が混ざり合って飛び跳ねているように見えるだけではありませんか? たとえば、各スレッドが現在のエントリを出力した場合、次のようなものが表示される場合があります

123 12 45 345 6....

これはシーケンシャルです....

于 2012-05-31T01:05:39.777 に答える
0

同期されたマップを使用できます。

private final Map<K, V> map = Collections.synchronizedMap(new LinkedHashMap<K, V>());

public void foo() {
    synchronized(map) {
        for(K key : map.keySet()) {
            // thread safe iteration
        }
    }
}
于 2012-05-31T01:05:56.593 に答える