Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当CPU非常繁忙时,我的多线程java程序会出现意外异常_Java_Multithreading_Nullpointerexception_Cpu Usage - Fatal编程技术网

当CPU非常繁忙时,我的多线程java程序会出现意外异常

当CPU非常繁忙时,我的多线程java程序会出现意外异常,java,multithreading,nullpointerexception,cpu-usage,Java,Multithreading,Nullpointerexception,Cpu Usage,我一直在做一个多线程java程序,它将使CPU使用率逐渐达到100%。当CPU使用率较低时,程序运行正常;但是当CPU接近100%时,我的程序抛出一个NullPointerException 我将对象放在数组列表中。当我从ArrayList获取一个对象标记时,[有时]会有一个null对象,因此当我在该对象上调用一个方法时,它会抛出一个NullPointerException 但是我已经检查了程序,没有任何null对象被放入ArrayList 所以,我想这是因为100%的CPU使用率。谁能给我解释

我一直在做一个多线程java程序,它将使CPU使用率逐渐达到100%。当CPU使用率较低时,程序运行正常;但是当CPU接近100%时,我的程序抛出一个
NullPointerException

我将对象放在
数组列表中。当我从ArrayList获取一个对象标记时,[有时]会有一个
null
对象,因此当我在该对象上调用一个方法时,它会抛出一个NullPointerException

但是我已经检查了程序,没有任何
null
对象被放入
ArrayList


所以,我想这是因为100%的CPU使用率。谁能给我解释一下原因吗

编写多线程代码(多个线程访问相同的数据结构)非常困难,需要的知识和经验超出了您在SO答案中所能提供的范围

Java内存模型定义了当多个线程访问同一数据时内存的运行方式

也就是说,根据你的描述,我可以告诉你一件事,你可以改变。不要将
ArrayList
直接用于多线程。ArrayList不会保护自己免受所谓的数据竞争

相反,请使用
Collections.synchronizedList(…)
创建一个列表,以保护其内部数据结构不受数据争用的影响:

List list = Collections.synchronizedList(new ArrayList());
这将确保当您没有将
null
对象放入列表中时,不会再从列表中获取
null
对象


但是,当多个线程对从列表中检索到的对象进行操作时,这并不能解决更复杂的数据争用问题。

编写多线程代码(多个线程访问相同的数据结构)是困难的,需要的知识和经验超出了SO答案中所能提供的范围

Java内存模型定义了当多个线程访问同一数据时内存的运行方式

也就是说,根据你的描述,我可以告诉你一件事,你可以改变。不要将
ArrayList
直接用于多线程。ArrayList不会保护自己免受所谓的数据竞争

相反,请使用
Collections.synchronizedList(…)
创建一个列表,以保护其内部数据结构不受数据争用的影响:

List list = Collections.synchronizedList(new ArrayList());
这将确保当您没有将
null
对象放入列表中时,不会再从列表中获取
null
对象


但是,当多个线程对从列表中检索的对象进行操作时,这并不能解决更复杂的数据争用问题。

听起来像是多线程引入的逻辑错误。我们需要您的代码来分析您的情况。最好使用探查器来分析这些情况。。我不认为NPE是由高CPU使用率引起的。不同步的操作总是会导致不确定的结果。听起来您在一个非线程安全的
集合上没有正确同步。这被称为比赛危险。不。如果线程安全方法在运行一次时有效,那么在同时运行多次时也有效。这可能是因为某些资源上存在竞争条件,随着踏板的增加,这种情况发生的可能性更大。此外,您可能不应该设计一个故意使CPU过载的程序,因为它可能会导致性能下降,因为操作系统陷入上下文切换的混乱中。@Boristeider我同意这种观点,但它比“非同步操作”要复杂一点(我相信您知道)-
volatile
变量是语义稍有不同的同步的替代,并且
final
字段通常也不需要同步。(如果引用没有逃逸构造函数)听起来像是多线程引入的逻辑错误。我们需要您的代码来分析您的情况。最好使用探查器来分析这些情况。。我不认为NPE是由高CPU使用率引起的。不同步的操作总是会导致不确定的结果。听起来您在一个非线程安全的
集合上没有正确同步。这被称为比赛危险。不。如果线程安全方法在运行一次时有效,那么在同时运行多次时也有效。这可能是因为某些资源上存在竞争条件,随着踏板的增加,这种情况发生的可能性更大。此外,您可能不应该设计一个故意使CPU过载的程序,因为它可能会导致性能下降,因为操作系统陷入上下文切换的混乱中。@Boristeider我同意这种观点,但它比“非同步操作”要复杂一点(我相信您知道)-
volatile
变量是语义稍有不同的同步的替代,并且
final
字段通常也不需要同步。(如果引用没有逃逸构造函数)
synchronizedXXX
也不会保护复合操作。在没有看到OPs代码的情况下,很难提出任何有意义的建议。我知道,但这肯定解决了OP的问题:当他们没有在列表中放入任何
null
时,他们会将
null
从列表中删除。这是一个典型的数据竞争,由列表内部数据结构中的内存不一致引起。这就是OP在他们的问题中描述的问题。根据你的回答,我已经解决了我的问题。谢谢大家!@Erwin Bolwidt
synchronizedXXX
也不保护复合操作。在没有看到OPs代码的情况下,很难提出任何有意义的建议。我知道,但这肯定解决了OP的问题:当他们没有在列表中放入任何
null
时,他们会将
null
从列表中删除。这是一个典型的数据竞争,由lis内部数据结构中的内存不一致引起