JavaME和/或Proguard是否重新排序分配?

时间:2012-09-26 08:54:51

标签: java multithreading java-me proguard synchronized

这是一个简化的例子 - 我有两个主题:

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。我确实意识到同步这些将避免这个问题。同步既有性能开销,更重要的是有机会引入死锁。

1 个答案:

答案 0 :(得分:2)

当前版本的ProGuard(在撰写本文时最高为4.8版)不会对此类语句重新排序。但是,如果字段不是易失性的,Java内存模型确实允许重新排序,因此您不应该依赖它。 Java虚拟机,ProGuard的未来版本或其他工具可能会很好地重新排序代码。至少volatile字段不会引入死锁。