访问元素时访问向量的异常

时间:2013-05-29 18:10:02

标签: java multithreading exception vector

我试图在核心java和多线程上调整我的概念。在读一些我发现的书时 如果另一个线程以某种方式访问​​该向量,则下面的代码可能抛出ArrayIndexOutOfBoundsException

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

我真的尝试了很多,但无法弄清楚如何? 任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

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

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) {...}方法正文或使用更复杂的方法。

相关问题