我一直在做一个多线程的java程序,它会使CPU使用率逐渐达到100%。当CPU使用率低时,程序运行正常;但是当CPU使用率接近100%时,我的程序抛出一个NullPointerException。
我将对象放在ArrayList中。当我从ArrayList获得一个对象令牌时,有时会有一个null对象,所以当我在该对象上调用一个方法时,它会抛出一个NullPointerException。
但是我已经检查了程序,没有null对象被放到ArrayList中。
所以,我猜这是因为100%的CPU使用率。有人能给我解释一下原因吗?
发布于 2014-06-22 17:01:05
编写多线程代码(访问相同数据结构的多个线程)是困难的,并且需要的知识和经验超出了您在SO答案中所能提供的范围。
Java内存模型定义了当多个线程访问相同的数据时内存是如何工作的。
也就是说,从你的描述中,我可以告诉你一件你可以改变的事情。不要在多线程中直接使用ArrayList。ArrayList不会保护自己免受所谓的数据竞争的影响。
相反,使用Collections.synchronizedList(...)创建一个列表来保护其内部数据结构不受数据竞争的影响:
List list = Collections.synchronizedList(new ArrayList());这将确保当您没有将null对象放入列表中时,将不再从列表中获取null对象。
但是,当多个线程对从列表中检索到的对象进行操作时,这并不能解决更复杂的数据竞争问题。
https://stackoverflow.com/questions/24349632
复制相似问题