一个常见的例子解释了关键字的功能。volatile
可以是这样的(引自 此处):
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
会被 "写通",让其他线程可以看到。更何况。 x
是受 v
的行为也像挥发性,因为 x
是上面分配的。
所以我的问题是,在多大程度上 volatile
可以影响之前的操作吗?
影响的范围是否只限于赋有volatile属性的函数?所以在下面的情况下, x
不会有 "写通 "的行为。
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();
}
它建立了一个 "发生在之前 "的关系,所以在该线程内,在volatile写入之前发生的任何事情对其他线程都是可见的。在你的最后一个例子中,尽管涉及到多个函数,但它们都在同一个线程中依次执行,在volatile写入之后,之前的所有写入都将是可见的。