2013-07-04 4 views
7

私はアンドロイドのゲームで作業していますが、onTouchEventがUIスレッドで実行されており、更新/レンダリングのメソッドが個別のスレッドから実行されていることに気がつきました。両方ともArrayListエンティティ。彼らが同時にリストを変更した場合、明らかに衝突します。ArrayListからVectorに変更する

VectorクラスはArrayListと全く同じように使用されていますが、Vectorは同期していますが、それらは競合しません。本当?もしそうなら、それは私が心配しなければならないパフォーマンス上の問題または何かを持っていますか?私は前にVectorクラスを使ったことがありません。

編集:私は実際に意味することは

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

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

からの変更はしましたが、答えが言うように、Vectorが使用することをお勧めしません。選択された回答が私の問題を解決しました。

+2

あなたは – BackSlash

+0

技術的にそれはないですが、本当にそれは古代とに応じて、だ、それを使うべきではありませんので、 'Vector'が、廃止されました'Concurrent'パッケージの' List'が多分もっと良くなるでしょう。 –

+0

Jon SkeetはここでVectorを使わない理由を説明しています:http://stackoverflow.com/q/1386275/1065197 –

答えて

9

それは

synchronizedList

例を使用する代わりにベクトルを使用しないようにVector試しオールディーズです:ベクトルが廃止されたとみなされ、推奨されていません

list = Collections.synchronizedList(list); 

Why vector is considerer obsolete?

+0

これで解決します: 'List list = Collections.synchronizedList(new ArrayList ());' –

+0

それを得ました;)私が投稿したリンクでJon Skeetの答えを読んで、面白いです:) – nachokk

+0

うん、かなり面白いです。実際には、 'synchronized'ブロックについて少し理解してくれました。私はちょっと新しいです(: –

2
List<Foo> list = new Vector<Foo>(new ArrayList<Foo>()); 

を読んで動作するはずです。これらの両方の構造体はListインタフェースを実装しています。

他の人のように、これはお勧めしません。

+2

そのコードスニペットはあまり意味がありません。 – nif

+1

これは、Christopher Franciscoが求めていたことだと理解していましたが、ArrayListのデータを持つベクトルです。新しい配列リストはモックのようなものです。 – ArturSkowronski

+1

あなたのコードには論理的な意味がないことに気づいていますか?また、あなたが本当にOPを手助けすることを意図している場合は、知っている必要があります**他人を学ぶ** **ベクトルは**を使用することをお勧めしていません。 –

0

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

もう1つのオプションは、並行リストを使用することです。これは最初のコピーを意味しますが、アクセスパフォーマンスは大幅に向上します。 多くの読書リクエスト(絵画など)の場合は、CopyOnWriteArrayListが良い選択です。読み取りは通常のArrayListとほぼ同じくらい速く、ブロックされません。リスト全体への書き込みは、配列全体をコピーする必要があるため、シーケンシャルで高価になります。
CoWArrayListのもう1つのポイントは、ConcurrentModificationExceptionをキャッチせずに反復できることです。 iterator()によって返されるIteratorは、リストが変更された場合でも常に同じバッキング配列を使用します。レガシーコードと戦うために持っている人のために

20

はちょうど次の手順を実行します

new Vector<Obj>(anyThingWhichImplemntsCollection); 
関連する問題