[英]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.