1

これは簡単な例です。2 つのスレッドがあります。

JavaME および/ProguardobX = ...は、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の将来のバージョン、またはその他のツールは、コードを並べ替える可能性があります。少なくとも揮発性フィールドはデッドロックを引き起こしません。

于 2012-09-26T21:35:47.947 に答える