我有一段关于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的?
ArrayList和Vector线程安全问题(新手提问)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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了本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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了?