最近、私はvolatile
というフラグテクニックを見つけました。これはまたはlock
を使用することを避けることができます。ここロックの代わりにvolatileフラグを使用する方法
http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html
volatile
フラグを使用してのコード例の一つです。
正しい実施例
Thread 1
========
// re-odering will not happen. initialize_var...
// will not move below "volatile_initialization_ready = true"
// statement.
initialize_var1();
initialize_var2();
initialize_var3();
volatile_initialization_ready = true;
Thread 2
========
if (volatile_initialization_ready) {
use_var1();
use_var2();
use_var3();
}
しかし、私はちょうど次のように特定の状況で、この技術を使用することはできません見つけます。
間違っ実施例
Thread 1
========
volatile_going_to_destroy = true;
destroy_var1();
destroy_var2();
destroy_var3();
Thread 2
========
if (volatile_going_to_destroy) {
return; // ignore.
}
// But Thread 1 still able to perform destroy
// when Thread 2 halt right here. Also, re-ordering might
// happen, where destroy_var1 might move above
// "volatile_going_to_destroy = true" statement.
use_var1();
use_var2();
use_var3();
私が思っていた
、それは私が間違っ実施例仕事をするが、ちょうどやlock
を使用せずに、volatile
を使用することは可能でしょうか?
java.util.concurrent.atomicパッケージは、単一変数に対するロックフリースレッドセーフプログラミングをサポートするクラスを提供します –