我一直在做一个多线程的java程序,它会使CPU的使用率逐渐达到100%。 CPU使用率低时,程序运行正常;但是当CPU接近100%时,我的程序会抛出NullPointerException
。
我将对象放在ArrayList
中。当我从ArrayList获取对象令牌时,[有时]是一个null
对象,所以当我在对象上调用一个方法时,它会抛出一个NullPointerException。
但是我已经检查了该程序,并且null
中没有ArrayList
个对象。
所以,我想这是因为100%的CPU使用率。任何人都可以解释我的原因吗?
答案 0 :(得分:4)
编写多线程代码(访问相同数据结构的多个线程)很困难,并且需要超出您在SO答案中提供的知识和经验。
Java内存模型定义了当多个线程访问相同数据时内存的运行方式。
那就是说,根据你的描述,我可以告诉你一件事你可以改变。不要直接在多个线程上使用ArrayList
。 ArrayList不会保护自己免受所谓的数据争用。
相反,使用Collections.synchronizedList(...)
创建一个列表来保护其内部数据结构免受数据争用:
List list = Collections.synchronizedList(new ArrayList());
这样可以确保当您没有在其中放置null
个对象时,您将不再从列表中获取null
个对象。
但是,当多个线程对从列表中检索的对象进行操作时,这并不能解决更复杂的数据争用。