在服务器为客户端提供现有Collection的unmodifiableCollection并且客户端开始迭代它的情况下,同时如果在服务器级别,一个线程更改List,例如删除它的元素。这会导致客户例外吗? 如果是,那会是什么? 对于客户端来说,在迭代列表时突然发现异常会不会很奇怪?
答案 0 :(得分:1)
首先,它可能取决于集合,因为它未在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就会丢失原始的集合引用。这样你就不必担心同时修改集合,因为你永远无法做到这一点。或者,如果您必须在此之后不久修改原始集合,您只需创建集合的副本并对其进行迭代。然后可以同时修改原始集合。关键部分将与新的(复制)集合创建一样短。
答案 1 :(得分:0)
客户无法更改unmodifiableCollection
,因此unmodifiableCollection
不允许删除。
答案 2 :(得分:0)
首先,它取决于client
是什么。如果客户端通过网络或其他方式接收集合,那么服务器端集合上的更改不会更改客户端的集合,因为它是不同JVM上的不同对象。
如果服务器和客户端都在同一个JVM中引用同一个对象,那么它取决于客户端的迭代方式。
如果客户这样做:
for(int i = 0;i < col.size();i++) { col.get(i);}
然后它不会导致错误。
如果客户端使用for(Object o : col)
或客户端直接使用Iterator,那么您将尽最大努力获得ConcurrentModificationException
。