Java并发--不稳定关键字能影响到什么程度?

问题描述 投票:0回答:1

一个常见的例子解释了关键字的功能。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();
}
java concurrency volatile
1个回答
3
投票

它建立了一个 "发生在之前 "的关系,所以在该线程内,在volatile写入之前发生的任何事情对其他线程都是可见的。在你的最后一个例子中,尽管涉及到多个函数,但它们都在同一个线程中依次执行,在volatile写入之后,之前的所有写入都将是可见的。

© www.soinside.com 2019 - 2024. All rights reserved.