2011-07-07 7 views
1

同期ブロック内での命令の並べ替えは可能ですか?例えば、java - 同期ブロック内での並べ替え

synchronized(lock) { 
    statement1; 
    statement2; 
} 

ここで、statement1とstatement2は互いに依存しません。プロセッサーまたはコンパイラーはこれらのステートメントの順序を変更できますか?

ありがとうございます。

+0

...互いに独立している場合は、どうして重要ですか? – mre

答えて

7

はいこれらの文は、オプティマイザがブロックを決定する場合、​​ブロック内で並べ替えることができます。しかし、彼らは​​から取り出すことはできません。

+0

+1ローチモーテルの類推が頭に浮かぶ... –

1

コンパイラ(実際にはオプティマイザ)は、物事を並べ替えるか、スコープ外に出る前に参照されない変数に割り当てるなどのコードを排除することもできます。それはスピードアップにつながります。これは同期ブロック内でのみ発生します。

-1

JSR-133によると、同期ブロック内のステートメントを並べ替えることができません。 http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html、セクション

を「「同期が何をするのか」スレッドの各アクションは、後で来るそのスレッド内のすべてのアクションの前に起こりますプログラムの順序で。

+1

プログラムの順序は、Javaソースコードの文の語彙順を意味するものではありません。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.3を参照してください。 –

関連する問題