我试图在核心java和多线程上调整我的概念。在读一些我发现的书时
如果另一个线程以某种方式访问该向量,则下面的代码可能抛出ArrayIndexOutOfBoundsException
。
for (int i = 0; i < vector.size(); i++){
doSomething(vector.get(i));
}
我真的尝试了很多,但无法弄清楚如何? 任何人都可以帮助我。
答案 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) {...}
方法正文或使用更复杂的方法。