用volatile标志代替锁定技术

Che*_*eng 2 java multithreading

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

http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html

这是使用volatileflag 的代码示例之一.

正确的工作实例

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();
}
Run Code Online (Sandbox Code Playgroud)

但是,我发现我在某些情况下不能使用这种技术,如下所示.

错误的工作示例

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();
Run Code Online (Sandbox Code Playgroud)

我想知道,我是否有可能使错误的工作示例工作,但只是使用volatile,而不使用synchronizedlock

Ara*_*ram 7

volatile只解决了可见性问题.您仍需要用于同步的锁.