私はAndroidでOpenGlを使用しています.drawと呼ばれるコールバックメソッドがあり、制御なしで呼び出されます。(私が間違っていなければ、デバイスが処理できる速さで) .draw メソッドと .update メソッドを持つ「GameObjects」のリストがあります。それぞれを処理する 2 つの異なるスレッドがあります。問題は、同じリンク リストを反復処理する 2 つの異なるスレッドの 2 つの異なるメソッドで、2 つの異なる反復子を宣言できるかどうかです。もしそうならListIterator<GameObject> l = objets.listIterator()
、新しい反復子が必要になるたびに宣言するだけで、他の反復子に干渉しませんか?
3 に答える
これは問題なく動作し、複数の反復子を使用して単一のインスタンスを反復することは問題ではありません。
を使用している限りSynchronizedList
、リストを変更できない理由はありません。リストへのSynchronizedList
同時変更をブロックし、スレッドセーフにします。
利用可能な場合は Guava ライブラリを使用することをお勧めします。また、それらのSynchronizedList
データ構造Iterables.filter
とIterables.transform
メソッドを一緒に使用しPredicates
、Functions
リストを並べ替えて変換することをお勧めします。
Guava ライブラリの詳細については、こちらをご覧ください。
http://code.google.com/p/guava-libraries/
http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html
明確にするために:
リストを繰り返し処理している間、次のようにブロック内のリストを同期する必要があります。
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext()){
foo(i.next());
}
}
はい、同じリストに対して複数のイテレータを使用できます。それらは互いに干渉しません。
できないことは、イテレータがまだアクティブなときにリストを変更することです (つまり、できますが、これによりイテレータが壊れ、例外で失敗します)。
はい、できます。反復中にリストを変更していないことを確認してください。そうするつもりなら; 反復を同期してください。