私は次のようなクラスを持っています:
class Test
{
private LinkedList<Person> persons = new LinkedList<Person>;
public synchronized void remove(Person person)
{
persons.remove(person);
}
public List<Person> getAllPersons()
{
// Clients may iterate over the copy returned and modify the structure.
return new ArrayList<Person>(persons);
}
}
persons同時に変更できます。1つはremove()1つのスレッドによるもので、2つはによって返される浅いコピーされたインスタンスによるものgetAllPersons()です。
マルチスレッド環境で上記のシナリオをテストして、が呼び出されたConcurrentModificationExceptionときに浅いコピーを返すことで回避できるかどうかを確認しました。getAllPersons()うまくいったようです。私は一度もに遭遇したことがありませんConcurrentModificationException。
この場合、なぜ浅いコピーだけを作成するのはpersons避けConcurrentModificationExceptionますか?