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