2017-09-13 59 views
3

我有以下类更改易失性字段是否更新对象?

public class Guardian { 
    volatile String response; 
    private Future future; 
    private Long time; 
} 

如果反应是由线程A进行修改,然后将线程B通过看响应的新值:

Guardian guardian = requestManager.getGuardian(); 
String response = guardian.getResponse(); 
+3

*“是否改变挥发性场更新对象?“*为什么不呢?更改非易失性字段的确如此。 –

回答

3

假设大家都知道,字符串是不可变的,那么是的,挥发性关键字给你的保证,线程B将得到最后的值响应无论在哪个线程发生。

1

是否guardian.getResponse()只是返回响应?如果是,那么是的 - 如果线程A修改guardian.response并且线程B之后调用getResponse(),则线程B将看到新值。

1

是的。这正是您从volatile关键字获得的保证。

3

volatile关键字可防止将变量缓存到线程本地内存中。它阻止的是false positives,因为您的变量已在主内存中更改,但该更改尚未反映在本地缓存内存中。

你的例子是受到Race condition,因为这将取决于对各执行其相关操作线程的时间,但假设是没有问题的,那么,你会得到JVM中该变量的最新版本,因为它未缓存在线程本地内存中。

1

volatile使得线程每次读取实际值,而在常规情况下,线程可以缓存值,并没有意识到它的变化