【发布时间】:2013-11-13 06:53:27
【问题描述】:
背景
我想了解为什么 sn-p 代码不会抛出 NullPointerException。
源代码
考虑以下代码:
public class Agent {
public List files = new ArrayList();
public void deliver() {
if( files != null && files.iterator().hasNext() ) {
File file = (File)files.iterator().next();
}
files = new ArrayList();
}
}
deliver 方法被重复调用,而以下代码在单独的线程中运行:
public void run() {
agent.files = null;
}
只有一个 agent 实例。
问题
永远不会抛出 NullPointerException。
但是,当 deliver 方法暂停时,即使是 0 毫秒,也会按预期抛出 NullPointerException:
public void deliver() {
if( files != null ) {
Thread.currentThread().sleep( 0 );
if( files.iterator().hasNext() ) {
File file = (File)files.iterator().next();
}
}
files = new ArrayList();
}
我的理解是,理论上,检查files == null 和调用files.iterator().hasNext() 之间存在竞争条件。在实践中,如果不引入暂停(即将空检查与后续方法调用分开),我无法触发竞争条件。
问题
为什么第一个deliver方法在null检查和用法结合在同一个语句中时不会抛出异常?
【问题讨论】:
-
你能在适当的比赛条件区域附近发布
javap输出吗? -
当你制作
filesvolatile时会发生什么?
标签: java multithreading nullpointerexception thread-safety