서버가 클라이언트에게 기존 Collection의 unmodifiableCollection을 제공하고 클라이언트가 반복 실행을 시작하는 경우 서버 레벨의 한 스레드가 List를 변경하는 경우와 같이 제거 그것의 요소. 이로 인해 고객에게 예외가 발생합니까? 그렇다면 무엇이 될 것입니까? 클라이언트가 갑자기 목록을 반복하는 동안 예외가 발생하면 이상한가?unmodifiableCollection이 클라이언트에서 반복 실행 중 서버에서 변경됨
답변
우선 컬렉션에 따라 다릅니다. Collection
또는 Collections
클래스 내부에는 아무 것도 지정되어 있지 않기 때문일 수 있습니다.
둘째, 테스트하는 것이 매우 쉽습니다.
public class CollectionModTest {
public static void main(String[] args) {
Collection<String> original = new HashSet<String>();
original.add("1");
original.add("2");
original.add("3");
original.add("4");
int counter= 5;
Collection<String> unmodifiable = Collections.unmodifiableCollection(original);
for (String val: unmodifiable) {
System.out.println(val);
original.add(""+counter);
counter++;
}
}
}
그냥 사용 구현과
Collection
구현을 교체하고 예외를 던지거나하지 있을지 확신 할 수.
좋은 사례 IMO는 수정 불가능한보기를 생성하면 원래의 컬렉션 참조를 잃게됩니다. 그렇게하면 절대 수집 작업을 수행 할 수 없기 때문에 컬렉션을 동시에 수정하는 것에 대해 걱정할 필요가 없습니다. 또는 나중에 바로 원래 컬렉션을 수정해야하는 경우 컬렉션 복사본을 만들어 반복 할 수 있습니다. 그런 다음 원본 컬렉션을 어디에서나 수정할 수 있습니다. 중요한 섹션은 새로운 (복사본) 컬렉션 생성만큼 짧을 것입니다.
클라이언트가 unmodifiableCollection
을 변경할 수 없으므로 에서 제거 할 수 없습니다.
먼저 client
에 따라 다릅니다. 클라이언트가 네트워크 또는 다른 방법을 통해 컬렉션을 받으면 서버 측 컬렉션의 변경 사항은 다른 JVM의 다른 객체이기 때문에 클라이언트 컬렉션을 변경하지 않습니다.
서버와 클라이언트가 모두 동일한 JVM 내에서 동일한 객체를 참조하는 경우 클라이언트가 반복하는 방법에 따라 다릅니다.
클라이언트가 다음을 수행하는 경우 : for(int i = 0;i < col.size();i++) { col.get(i);}
오류가 발생하지 않습니다.
클라이언트가 for(Object o : col)
을 사용하거나 클라이언트가 Iterator를 직접 사용하는 경우 최선의 노력으로 대부분 ConcurrentModificationException
이됩니다.
'Collection'은 인덱스에 의한 getter를 가지고 있지 않습니다. 콜렉션은 순서를 결정하지 않습니다. 'List' 기반 컬렉션에서 소개되었습니다. – Dariusz
나는 클라이언트가 수정 불가능한보기를 얻는다 고 생각한다. –
'Collections.unmodifiableCollection()'은 원래 컬렉션의 뷰를 반환합니다. 여전히 origianl 컬렉션을 수정할 수 있습니다. 그리고 포스터는 그 갈등을 묻습니다. – Dariusz