java中的枚举是否是故障安全的?如果有,怎么样?

时间:2017-10-29 07:59:34

标签: java enumeration

java中有失败的安全迭代器,它创建集合的副本以迭代以提供失败安全行为。

枚举适用于遗留的java类Vector,Stack和HashTable等(这些是同步集合)。

java中的枚举如何安全失败,它如何提供故障安全行为? 它是否也为迭代创建了集合的副本?

1 个答案:

答案 0 :(得分:0)

我不会致电Enumeration故障安全。

至少不是Vector elements()方法返回的实现:

public Enumeration<E> elements() {
    return new Enumeration<E>() {
        int count = 0;

        public boolean hasMoreElements() {
            return count < elementCount;
        }

        public E nextElement() {
            synchronized (Vector.this) {
                if (count < elementCount) {
                    return elementData(count++);
                }
            }
            throw new NoSuchElementException("Vector Enumeration");
        }
    };
}

如果在迭代时修改Vector,此实现可能会导致错误行为而不会抛出异常。

例如,以下代码将导致无限循环,其中对els.nextElement ()的每次调用都将返回相同的元素"a"

Vector<String> vec = new Vector<> ();
vec.add ("a");
vec.add ("b");
vec.add ("c");
Enumeration<String> els = vec.elements ();
while (els.hasMoreElements ()) {
    System.out.println (els.nextElement ());
    vec.add (0,"d");
}