8

私はAndroidゲームに取り組んでいonTouchEventますが、UIスレッドで実行され、更新/レンダリングメソッドが別のスレッドから実行されていることに気付きました。どちらもArrayListエンティティを含むものを更新します。したがって、たまたまリストを同時に変更すると、明らかに競合します。

クラスが同期されている唯一の違いとVectorまったく同じように使用されていることを読んだので、それらは競合しません。本当?もしそうなら、パフォーマンスの問題や私が心配する必要があるものはありますか? 私は今までクラスを使用したことがありません。ArrayListVectorVector

編集:私が実際に意味したのは、からの変更でした

ArrayList<Obj> list = new ArrayList<Obj>();

Vector<Obj> list = new Vector<Obj>()

しかし、答えが言うように、Vector使用することはお勧めしません。選択した回答で問題が解決しました。

4

4 に答える 4

9

代わりにVectorVectorを使用しないようにしてください。

synchronizedList

例 :

list = Collections.synchronizedList(list);

ベクターは廃止され、非推奨と見なされます

于 2013-07-04T21:53:18.293 に答える
2
List<Foo> list = new Vector<Foo>(new ArrayList<Foo>());  

動作するはずです。これらの構造はどちらも List インターフェイスを実装しています。

しかし、他の人が示唆したように、これはお勧めできません。

于 2013-07-04T21:53:30.770 に答える
0

nachokk が既に述べたように、うまくいきsynchonizedListます。 synchronizedListリストのラッパーを返すため、コピーは行われません。
欠点は、リストへの呼び出しを一度に 1 つしか実行できないことです。リストでの 2 つの読み取りは、並列で実行できる場合でも順次になります。同期ブロックは常にわずかなオーバーヘッドを意味し、頻繁に呼び出されるとパフォーマンスが低下します。

別のオプションは、同時リストを使用することです。これはそもそもコピーを意味しますが、アクセス パフォーマンスは劇的に向上する可能性があります。多数の読み取り要求がある場合 (絵画など)、aCopyOnWriteArrayListが適しています。読み取りは通常の ArrayList とほぼ同じ速さで、ブロックされません。リストへの書き込みは、配列全体をコピーする必要があるため、シーケンシャルでコストがかかります。
CoWArrayList のもう 1 つの良い点は、ConcurrentModificationException をキャッチせずに反復できることです。によって返される Iterator はiterator()、リストが変更された場合でも、常に同じバッキング配列を使用します。

于 2013-07-05T09:11:19.893 に答える