当CPU非常繁忙时,我的多线程java程序会出现意外异常
我一直在做一个多线程java程序,它将使CPU使用率逐渐达到100%。当CPU使用率较低时,程序运行正常;但是当CPU接近100%时,我的程序抛出一个当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使用率。谁能给我解释
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 BolwidtsynchronizedXXX
也不保护复合操作。在没有看到OPs代码的情况下,很难提出任何有意义的建议。我知道,但这肯定解决了OP的问题:当他们没有在列表中放入任何null
时,他们会将null
从列表中删除。这是一个典型的数据竞争,由lis内部数据结构中的内存不一致引起