2

次のようなオブジェクトの大きな ArrayList があります

class Entry {
    private String variable1 = null;

    private int variable2 = 0;

    public Entry (String variable1) {
    this.variable1 = variable1;
    }

   /* getters and setters for variable1 and 2 are below */
}

ArrayList でオブジェクトを開始してから、複数のスレッドを作成します。各スレッドは、大量のドキュメント セットを検索して、変数 1 の内容がドキュメントに埋め込まれているかどうかを判断します。そうである場合、以下のように、スレッドに固有のエントリのコピーを作成したいと思います。

public Entry(Entry entry) {
    this(entry.getVariable1())
  }

次に、オリジナルではなくコピーの variable2 の内容を変更したいと考えています。要約する:

  1. オブジェクトの値は、スレッド化の前に初期化されます。
  2. オブジェクトは複数のスレッドによって共有 (読み取り専用) されます。
  3. オブジェクトを変更する必要がある場合、オブジェクトのコピーが作成され、そのコピーに変更が加えられます。

これが私の質問です。

  1. variable1 と variable2 の getter と setter を同期する必要がありますか。スレッド間で共有されているときにオブジェクトを読み取っているだけなので、これは不必要に思えますが、間違っている場合は修正してください。
  2. 情報の大きな配列リストを共有するためのより良い方法はありますか? (200Kを超えるオブジェクトで巨大であるため、各スレッドのarraylistをコピーしたくありません)?
4

2 に答える 2

5
  1. 読み取り専用の共有配列に格納されているオブジェクトのコピーを作成する場合は、getter/setter を同期する必要はありません。

  2. リストが読み取り専用である限り、あなたのアプローチは問題ないようです

于 2012-04-19T12:20:22.437 に答える
1

各スレッドのローカル コピーを使用して、元のリストをシャドウするコレクションを作成します。

public class ShadowList<T> {
    private final List<T> original;
    private final List<T> local;

    public ShadowList(List<T> original) {
        this.original = original;
        local = Arrays.<T>asList((T[]) new Object[original.size()]);
    }

    public T get(int n) {
        T t = local.get(n);
        if (t == null)
            t = original.get(n);
        return t;
    }

    public void set(int n, T t) {
        local.set(n, t);
    }
}
于 2012-04-19T12:22:52.943 に答える