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条)

报告相同问题?

悬赏问题

  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 微信小游戏反编译后,出现找不到分包的情况
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)