-1

我正在尝试调整我对核心 Java 和多线程的概念。ArrayIndexOutOfBoundsException在阅读某本书时,我发现如果另一个线程以某种方式访问​​该向量,则可能会抛出以下代码。

for (int i = 0; i < vector.size(); i++){
   doSomething(vector.get(i));
}

我真的尝试了很多,但无法弄清楚如何?谁可以帮我这个事。

4

1 回答 1

1

Vector 已同步所有字段。在这种情况下,我们执行诸如获取vertor的大小之类的操作,然后我们尝试稍后访问该i元素。vertor.size()它们都是同步的,但它们是及时分布的,我们得到的和之间没有同步,vector.get(i)所以我们当前的线程可以暂停,向量可以被另一个线程修改,所以向量的大小可能会改变。例如:

public class TestClass {
    private static final Vector vector = new Vector();

    public static void iterate() {
        for (int i = 0; i < vector.size(); i++) {
            doSomething(vector.get(i));
        }
    }

    public static void main (String... args) {
            //initialize vector and fill it
        new Thread( new Runnable() {
            @Override
            public void run() {
                iterate();
            }
        }, "A").start();

        new Thread( new Runnable() {
            @Override
            public void run() {
                vector.clear();
            }
        }, "B").start();
    }

    private static void doSomething(Object object) {
        //DO SMTHNG.
    }
}

在这种情况下,虽然线程A将遍历向量,但线程B可以清除它,因此i可以大于新向量的大小(在本例中为 0)。解决此问题的最简单方法是iterate()用块覆盖方法主体synchronized (vector) {...}或使用更复杂的方法。

于 2013-05-29T18:27:30.690 回答