2

複数のスレッドからアクセスされる ArrayList があります。メインスレッドはリストをクリアするだけで、他のスレッドはそれに追加します。別のスレッドがアイテムを追加している間にリストをクリアしたくありません。スレッドがアイテムを追加している間、リストをロックしたい。

これはスレッドを追加するコードです:

synchronized (items)
{
    int length = jsonArray.length();
    if ((length > 0)) for (int i = 0; i < length; i++)
    {
        items.add(new Item(jsonArray.getJSONObject(i)));
    }
}

ただし、同期ブロックを使用してクリアすることはありません。クリアにもシンクロブロックは必要?

4

2 に答える 2

2

これを処理する簡単な方法は、単に使用することです

List<Foo> items = Collections.synchronizedList(new ArrayList<Foo>());

すべてのメソッドが同期され、安全になります。

ここで誰かがパフォーマンスについて何かコメントした場合は、OP のシナリオの実際のデータを提供して、主張を裏付けてください。

于 2013-10-17T20:02:47.150 に答える
1

別のスレッドがアイテムを追加している間にリストをクリアしたくありません。

そうです、あなたもclearルーチンを持つ必要がありsynchronizedます。

以下のサンプルでは、​​同期ステートメントaddはブロックされませんclear

public void add(T t) {
   synchronized(items) {
      items.add(t);
   }
}

public void clear() {
   items.clear();
}
于 2013-10-17T19:50:42.617 に答える