私は次のようなクラスを持っています:
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
ますか?