在客户端迭代时,unmodifiableCollection在服务器上发生更改

时间:2013-10-11 09:29:59

标签: java collections unmodifiable

在服务器为客户端提供现有Collection的unmodifiableCollection并且客户端开始迭代它的情况下,同时如果在服务器级别,一个线程更改List,例如删除它的元素。这会导致客户例外吗? 如果是,那会是什么? 对于客户端来说,在迭代列表时突然发现异常会不会很奇怪?

3 个答案:

答案 0 :(得分:1)

首先,它可能取决于集合,因为它未在CollectionCollections类中的任何位置指定。

其次,测试它非常简单。

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