gpt4 book ai didi

java - 我们如何获得NPE,race condition

转载 作者:搜寻专家 更新时间:2023-10-31 08:11:46 28 4
gpt4 key购买 nike

我在面试中被问到以下问题。给定以下代码,如果方法 adddoAction 被多个线程调用,我们如何在打印 toString 时得到 NullPointerException ?**

public class Test{
private List<Object> obj = new ArrayList<Object>();

public void add(Object o){
obj.add(o);
}

public void doAction(){
for(Object o: obj){
System.out.println(o.toString()); // maybe NPE, why?
}
}

}

消除所有其他多线程问题。

最佳答案

首先,让我们更改变量的名称; List<Object> list=new ArrayList<>();因为“obj”对于引用 List 的变量来说是一个非常糟糕的名称.

好的,当程序调用list.add(o);时,它可能需要增加数组。这意味着它必须:

  1. 分配一个新的、更大的数组,其成员都将被初始化为null。 , 和
  2. 将旧数组中的元素复制到新数组中。,

如果线程 A 正在执行此操作,同时线程 B 正在调用 iterator.next() ,线程 B 可能最终读取 null即使 线程 A 已经将对象引用复制到数组的该成员中,新数组中的值也是如此。

记住:当线程在没有同步的情况下访问内存时,读取器线程可能会看到变量/字段/数组成员的更新以不同的顺序发生编写线程实际上执行了它们。

关于java - 我们如何获得NPE,race condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43213204/

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