1

这是一个简化的示例 - 我有两个线程:

JavaME 和/Proguard 是否可以对obX = ...语句重新排序,这样 thread_B 将在 处出现空指针异常ob1.someMethod

线程_A:

Object ob1 = null;
Object ob2 = null;
...
ob1 = something1;
ob2 = something2;

线程_B:

if (ob2 != null) {
    ob1.someMethod();
    ...
}

PS我确实意识到同步这些可以避免这个问题。同步既有性能开销,更重要的是有可能引入死锁。

4

1 回答 1

2

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

于 2012-09-26T21:35:47.947 回答