2012-07-11 9 views
9

Effective Java同期化がない場合、以下のシーケンスAは仮想マシンによってシーケンスBに変換でき、これはhoistingと呼ばれます。私はまた、変数を含む揮発性命令を並べ替えることができるため、変数が宣言されていない場合はどこかを読んでいます。同じものを持ち上げて並べ替えていますか?同じものを吊り上げて並べ替えていますか?

while (!done) sequence A  
    i++; 

    if (!done) 
    while (true) sequence B 
     i++; 
+0

[ホットスポットが次のホイストを最適化する理由は?](http://stackoverflow.com/questions/9338180/why-hotspot-will-optimize-the-following-using-hoisting) –

答えて

13

これらは若干異なります。

ホイストは、ループ自体が操作の結果に影響を与えないため、ループから何らかの操作を取り除いたことを意味します。あなたのケースでは、whileループから条件テストを引き出しています。

並べ替えの順序は、結果に影響を与えない方法で命令の順序を変更することを意味します。通常、これはデータ依存性のない隣接命令である。あなたが次の2つのステートメントを実行しているため重要ではありません:

int a = x; 
int b = y; 
0

並べ替えは、並べ替えなどの性能に影響を与えない実行のパフォーマンスに関するものです。

ホイストは、メモリバリア命令の並べ替えに行われます。

1

Javaメモリモデルで使用されている「並べ替え」という用語は、不適切に同期されたプログラムの正確さに影響する可能性のあるすべての最適化を指します。

したがって、この意味での並べ替えは、巻き上げ、順序外実行の影響、メモリ階層(つまりキャッシュ)に起因する不一致などの最適化を含む一般的な用語です。