最近,我遇到了volatile
旗帜技术,我可以避免使用synchronized
或lock
。
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();
我想知道,我是否可以使用错误的工作示例工作,但只使用volatile
,而不使用synchronized
或lock
?< / p>
答案 0 :(得分:7)
易失性仅解决visibility problem问题。您仍然需要locks for synchronization。
答案 1 :(得分:0)
您可以使用以下http://en.wikipedia.org/wiki/Dekker%27s_algorithm之类的算法。它允许安全的变量访问,只有内存屏障,但没有锁。