Java 并发性 - volatile 关键字可以影响多远
Java Concurrency - How far can the volatile keyword influence
一个常见的例子解释关键字volatile
的功能可以是这样的(引用自here):
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
由于 v
是易变的,对 v
的写操作将是 "write through" 以便其他线程可以看到。更重要的是,x
受 v
的影响也表现得像 volatile 因为 x
是在上面分配的。
所以我的问题是 volatile
能在多大程度上影响之前的操作?
影响是否仅限于分配了 volatile 属性的函数?所以在下面的例子中,x
不会有 "write through" 的行为:
public void foo() {
x = 42;
}
public void writer() {
foo();
v = true;
}
或者影响不会被限制并且可以传播到该线程中之前的所有操作?但考虑到以下情况,这似乎有点不可能:
private void foo() {
x = 42; // x will be written through
}
private void fooWrapper() {
foo();
}
private void writer() {
fooWrapper();
v = true;
}
// invoke this!
public void writerWrapper() {
y = 0; // y will be written through
writer();
}
它建立了 "happened-before" 关系,因此在该线程内,在易失性写入之前发生的任何事情都将对其他线程可见。在你的最后一个例子中,即使涉及多个函数,它们都在同一个线程中顺序执行,并且在易失性写入之后,之前的所有写入都是可见的。
一个常见的例子解释关键字volatile
的功能可以是这样的(引用自here):
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
由于 v
是易变的,对 v
的写操作将是 "write through" 以便其他线程可以看到。更重要的是,x
受 v
的影响也表现得像 volatile 因为 x
是在上面分配的。
所以我的问题是 volatile
能在多大程度上影响之前的操作?
影响是否仅限于分配了 volatile 属性的函数?所以在下面的例子中,x
不会有 "write through" 的行为:
public void foo() {
x = 42;
}
public void writer() {
foo();
v = true;
}
或者影响不会被限制并且可以传播到该线程中之前的所有操作?但考虑到以下情况,这似乎有点不可能:
private void foo() {
x = 42; // x will be written through
}
private void fooWrapper() {
foo();
}
private void writer() {
fooWrapper();
v = true;
}
// invoke this!
public void writerWrapper() {
y = 0; // y will be written through
writer();
}
它建立了 "happened-before" 关系,因此在该线程内,在易失性写入之前发生的任何事情都将对其他线程可见。在你的最后一个例子中,即使涉及多个函数,它们都在同一个线程中顺序执行,并且在易失性写入之后,之前的所有写入都是可见的。