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

时间:2014-06-22 08:49:04

标签: java multithreading nullpointerexception cpu-usage

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

我将对象放在ArrayList中。当我从ArrayList获取对象令牌时,[有时]是一个null对象,所以当我在对象上调用一个方法时,它会抛出一个NullPointerException。

但是我已经检查了该程序,并且null中没有ArrayList个对象。

所以,我想这是因为100%的CPU使用率。任何人都可以解释我的原因吗?

1 个答案:

答案 0 :(得分:4)

编写多线程代码(访问相同数据结构的多个线程)很困难,并且需要超出您在SO答案中提供的知识和经验。

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

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

相反,使用Collections.synchronizedList(...)创建一个列表来保护其内部数据结构免受数据争用:

List list = Collections.synchronizedList(new ArrayList());

这样可以确保当您没有在其中放置null个对象时,您将不再从列表中获取null个对象。

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