我有一段关于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 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,如何解決?