2011-02-08 19 views
2

最近、私は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を使用することは可能でしょうか?

答えて

0

http://en.wikipedia.org/wiki/Dekker%27s_algorithmのようなアルゴリズムを使用できます。これにより、メモリバリアのみで、ロックなしで安全な変数アクセスが可能になります。

+0

java.util.concurrent.atomicパッケージは、単一変数に対するロックフリースレッドセーフプログラミングをサポートするクラスを提供します –

関連する問題