gpt4 book ai didi

java - ArrayList 如何在下面的程序中存储 'null' 值?

转载 作者:行者123 更新时间:2023-11-30 02:01:32 26 4
gpt4 key购买 nike

public class SampleExecutorService {
private int count = 0;
List<Integer> numbers = new ArrayList<>();
private void increment() {
count++;
numbers.add(count);
}

public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
SampleExecutorService obj = new SampleExecutorService();
Runnable task = obj::increment;

for (int i = 0; i < 20; i++) {
executorService.submit(task);

}
executorService.shutdown();

try {
executorService.awaitTermination(2, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
obj.numbers.stream().forEach(System.out::println);
System.out.println("count : " + obj.numbers.size());
}
}

我只是增加计数并将该值添加到数组列表中。有时它存储预期值,但有时不存储( ArrayList<Integer> 包含“空”值)。请帮助我解决这个问题。

最佳答案

From the Javadoc of ArrayList :

Note that this implementation is not synchronized. If multiple threads access an ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally.

您正在从多个线程添加元素,但未在外部同步它。因此,您很容易在列表中看到未定义的行为 - 例如,当您从未实际添加 null 时,出现 null 元素。

您可以使用 Javadoc 中的提示轻松修复此问题:

List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());

(请注意,您可能仍然会看到其他“意外”行为,例如,相同的数字添加了两次,因为 count 没有以原子方式递增;或者元素在列表中的顺序不正确)

关于java - ArrayList<Integer> 如何在下面的程序中存储 'null' 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52702589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com