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 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?