这是一个简化的例子 - 我有两个主题:
JavaME和/ Proguard可以重新排序obX = ...
语句,这样thread_B在ob1.someMethod
会有一个空指针异常吗?
thread_A:
Object ob1 = null;
Object ob2 = null;
...
ob1 = something1;
ob2 = something2;
thread_B:
if (ob2 != null) {
ob1.someMethod();
...
}
P.S。我确实意识到同步这些将避免这个问题。同步既有性能开销,更重要的是有机会引入死锁。
答案 0 :(得分:2)
当前版本的ProGuard(在撰写本文时最高为4.8版)不会对此类语句重新排序。但是,如果字段不是易失性的,Java内存模型确实允许重新排序,因此您不应该依赖它。 Java虚拟机,ProGuard的未来版本或其他工具可能会很好地重新排序代码。至少volatile字段不会引入死锁。