在每个线程中我想运行这种代码 初始化列表
final int initialSize = 2000;
final Random rand = new Random(System.currentTimeMillis());
Thread creationThread = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < initialSize; j++) {
list.add(rand.nextInt(10000));
}
}
});
creationThread.start();
creationThread.join();
List<Thread> threads = new ArrayList<Thread>();
final int threadElemAmount = initialSize / numberOfThreads;
创建用于删除的线程
for (int i = 0; i < numberOfThreads; i++) {
threads.add(new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < threadElemAmount; j++) {
list.remove((int) (list.size() - 1));
}
}
}));
}
但是我遇到ArrayIndexOutOfBoundsException
读写问题。怎么避免这个?
答案 0 :(得分:0)
如果您只想确保删除操作成功,请按列表同步您的代码,例如:
public void run() {
for (int j = 0; j < threadElemAmount; j++) {
synchronized (list) {
list.remove((int) (list.size() - 1));
}
}
}
还要确保您正在使用相同的列表实例进行同步。
问题是由以下事实引起的:
list.remove((int) (list.size() - 1));
像这样处理:
1: int tempVal = list.size() - 1;
2: list.remove(tempVal);
在你的情况下,线程A执行第1行,产生执行上下文到线程B,执行1和2,然后线程A抛出异常。