繁体   English   中英

“非并发多线程”是否需要volatile关键字?

[英]Is the volatile keyword required for “non-concurrent multithreading”?

我有一个由多个线程使用的对象,但从未同时使用(总是只有一个线程在其上执行方法)。 它包含几个非最终字段。 现在,我想知道是否必须将所有字段都标记为volatile,以确保下一个线程(以前可能使用过该对象)将看到更改。 如果没有volatile,那么线程在什么时候从另一个线程获取更改? 有保证吗?

如果必须使用volatile,Akka如何解决此问题?

在后台,Akka将在一组实际线程上运行一组actor,其中通常有许多actor共享一个线程,而对一个actor的后续调用最终可能会在不同的线程上进行处理。 Akka确保此实现细节不会影响处理参与者状态的单线程。

没有必要让成员变量的volatile ,如果之前发生关系的对象之外设立的。 即使没有synchronized块,也可以建立事前发生的关系 下面的示例为此使用了一个volatile保证编写者和阅读者不能同时访问同一对象。 在这种情况下,可以确保读取器将读取正确的值。

class Foobar {
    public static volatile Foobar instance = new Foobar(42);
    public int value;
    public Foobar(int value) { this.value = value; }
}

int reader() {
    return Foobar.instance.value;
}

void writer(int value) {
    Foobar.instance = new Foobar(value);
}

因此,有趣的部分是对象外部的代码-保证只有一个线程可以访问该对象。 可以编写保证它的代码而无需建立事前发生的关系 但是,这很奇怪,您应该在此解决问题,而不是使成员变量volatile

如果可以确保一个线程和一个线程仅尝试同时访问该对象,则可以,将变量声明为volatile仍然是必要的,因为这样可以防止每个线程保存变量的“本地副本”并任意更新。

阅读本文并注意可见性部分,它将使您更清楚地了解volatile的含义。

如果没有volatile,线程可能会更改缓存中的对象,而volatile使线程刷新更改到内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM