【发布时间】:2017-10-23 00:19:58
【问题描述】:
我调用了一个从多个线程向列表添加项目的方法,该方法不同步
static List<String> list = new ArrayList<String>();
static void addItem(int itemNo){
list.add("item "+itemNo);
}
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++)
{
int itemNo = i;
Runnable task = () -> addItem(itemNo);
executor.execute(task);
}
executor.shutdown();
System.out.println(list);
}
打印列表的输出是随机的,每次我执行这段代码
我就是
[null, 第 1 项, 第 4 项, 第 5 项, 第 6 项, 第 7 项, 第 8 项, 第 9 项]
[第 1 项,空,第 2 项,第 4 项,第 5 项,第 3 项,第 6 项,第 7 项,第 8 项,第 9 项]
[第 1 项、第 2 项、第 3 项、第 4 项、第 5 项、第 6 项、第 7 项、第 8 项、第 9 项]
在第 1 和第 2 输出中,有空项目,第 1 在第 1 输出中,第 2 在第 2 中。而且列表的大小也不一样。
据我了解,多线程中的项目不会按顺序排列。我不知道在添加数组时项目有时会为空或跳过
我想了解这种行为,为什么将 null 项添加到数组中,以及为什么在我的方法未同步
时跳过项您的宝贵回答对我有很大帮助, 提前致谢
【问题讨论】:
标签: java multithreading arraylist synchronization executorservice