用volatile标志代替锁定技术

时间:2011-02-08 01:55:28

标签: java multithreading

最近,我遇到了volatile旗帜技术,我可以避免使用synchronizedlock

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,而不使用synchronizedlock?< / p>

2 个答案:

答案 0 :(得分:7)

易失性仅解决visibility problem问题。您仍然需要locks for synchronization

答案 1 :(得分:0)

您可以使用以下http://en.wikipedia.org/wiki/Dekker%27s_algorithm之类的算法。它允许安全的变量访问,只有内存屏障,但没有锁。