1

したがって、プログラムがこれを行う場合:

    static ArrayList<X> a = null;
    static{
            for(;;){X x = new X(); a.add(x)}
          }

共有リストで静的初期化後に呼び出される操作は、get()とxt()のみです。

       X x = a.get(i); x.t();

Xはコンテナにアクセスできず、スレッドセーフです。つまり、同期なしでこのようなArraylistを使用すると、スレッドセーフになります。

4

4 に答える 4

6

何も変更されていない場合は、ArrayListスレッドセーフについて心配する必要はありません。

その静的ブロックは、クラスがロードされるときに(初期化のために)一度だけ実行されるため、デフォルトではスレッドセーフです。

于 2012-11-05T00:43:01.437 に答える
6

リストが作成された後は変更されないようにする場合は、次のように強制します。をラップしArrayListますCollections.unmodifiableList()

さらに良いことに、Guavaを利用できる場合は、を使用してImmutableListください。

于 2012-11-05T00:51:07.783 に答える
1

ベクターは、必要な同期コレクションです。

コレクションの要素がスレッドセーフであるからといって、コンテナ自体がスレッドセーフであることを保証するものではありません。並行性についての私の理解に基づいています。

tバッキングコレクションを変更すると、スレッドセーフではなくなります。たとえばt、次のように定義されます。

this.list.remove(this.x);

安全ではないでしょう。

于 2012-11-05T00:42:57.927 に答える
1

スレッドセーフは、書き込み可能なオブジェクトでのみ問題になります。初期化されると、ArrayListは不変になり、スレッドセーフになります。配列リストの周りに変更不可能なラッパーを使用することを検討してください-それは

  1. アレイが変更されることを意図していないことを明確にする
  2. 将来の偶発的な変更を防ぐ

完全を期すために、ArrayListの操作はスレッドセーフですが、要素の操作はスレッドセーフではないことに注意してください。

于 2012-11-05T11:20:55.607 に答える