wensonzhou86 2010-11-02 11:17
浏览 243
已采纳

ArrayList和Vector线程安全问题(新手提问)

我有一段关于ArrayLisy和Vector线程安全的代码,如下:


import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class SynchronizedCollectionsTest {

static List<Integer> list = new ArrayList<Integer>(20);
static List<Integer> vector = new Vector<Integer>();

public static void main(String[] args) {
Thread thread1 = new Thread() {
public void run() {
for (int i = 0; i < 10; i++) {
list.add(list.size(), i);
vector.add(vector.size(), i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
};

Thread thread2 = new Thread() {
public void run() {
for (int i = 0; i < 10; i++) {
list.add(list.size(), i);
vector.add(vector.size(), i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
};

thread1.start();
thread2.start();

try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println(list);
System.out.println(vector);
}

}


现在想请教各位,list集合是如何产生出null的?

  • 写回答

7条回答 默认 最新

  • limengchengg 2010-11-03 09:21
    关注

    你看这段代码:
    List list = new ArrayList();
    list.add(0, 1);
    list.add(0, 1);
    list.add(2, 2);
    System.out.println(list);
    打印出来的结果是[1, 1, 2]
    在同一位置赋值两次,下个位置不是null是1,从源代码看就是将1往后挪动了一个位置。
    还有,如果中间某一个位置没有赋值的话,就抛出 java.lang.IndexOutOfBoundsException。
    我是不是钻牛角尖了啊,呵呵

    你理解错了
    你这样直接add是没有错
    因为add方法里面已经帮你做了往后移动数组的操作了
    源代码里面的操作,移动数组和赋值操作分开的
    所以先移动两次,再赋值的话,两次都是赋给了同一位置,后面那个位置没有被赋值
    所以是空
    你要看源代码 看外面的话,由于封装了很多,没法理解的

    其实这个不需要太深的去研究
    你只要记得ArrayList是非线程安全的,在add的时候需要加锁就ok了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?