2014-06-13 5 views
1

옵저버 패턴을 구현했으며 관찰자가 onUpdate 메소드에서 자신의 주제 (또는 다른 관찰자)를 등록 취소하도록 결정할 수 있다고 생각하십시오.옵저버 패턴의 동시 수정 방지

관찰자를 저장하기 위해 ArrayList를 사용한다고 가정하면 목록을 반복하면서 항목을 제거하므로 java.util.ConcurrentModificationException이 발생합니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 그의 onUpdate 방법에 대한 복제 반복하되,하지만 난 더 나은 솔루션이 될 것으로 판단 있도록

현재 나는이 기능을 지원 컬렉션의 숫자가 있습니다

답변

2

... 목록을 복제하고있다. 예를 들어 jME3은 SafeArrayList이라는 ArrayList의 변형을 사용합니다. 오픈 소스 프로젝트이므로 구현을 찾을 수 있습니다.

모든 읽기에서 복제보다 더 나은 해결책은 수정시 목록을 복사하는 것입니다. 새 목록을 만들고 변경 한 다음 다시 청취자 목록에 할당하십시오.

대부분의 경우 관찰자를 변경하면 관찰자가 반복되는 횟수가 줄어 듭니다.

목록을 복사하고 복제본을 수정하면 목록의 이전 버전을 반복하는 모든 항목에 변경 사항이 표시되지만 예외는 아닙니다.

2

현재 사본을 반복하는 것은 하나의 해결책입니다. CopyOnWriteArrayList을 사용하면 스레드로부터 안전 할 수도 있습니다. 물론 둘 다 특정 오버 헤드가 있습니다.