Java 更改可变字段是否会更新对象?

Java 更改可变字段是否会更新对象?,java,concurrency,volatile,Java,Concurrency,Volatile,我有以下课程 public class Guardian { volatile String response; private Future future; private Long time; } 如果响应由线程A修改,那么线程B会通过以下方式看到响应的新值: Guardian guardian = requestManager.getGuardian(); String response = guardian.getResponse(); 假设您知道字符串是不可

我有以下课程

public class Guardian {
    volatile String response;
    private Future future;
    private Long time;
}
如果响应由线程A修改,那么线程B会通过以下方式看到响应的新值:

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

假设您知道字符串是不可变的,那么是,volatile关键字保证线程B将获得response的最后一个值,无论发生在哪个线程上。

guardian.getResponse()是否只返回response?如果是,则选择“是”-如果线程A修改了
guardian.response
,线程B随后调用
getResponse()
,则线程B将看到新值。

选择“是”。这正是您从volatile关键字得到的保证。

volatile关键字防止变量缓存在线程本地内存中。它所防止的是误报,因为您的变量已在主内存中更改,但该更改未反映在本地缓存中

您的示例将受制于,因为它取决于每个线程执行其相关操作所花费的时间,但假设这不是问题,那么是的,您将在JVM中获得该变量的最新版本,因为它没有缓存在线程本地内存中。

是的

volatile
使线程每次都读取实际值,而在正常情况下,线程可能会缓存该值,而不知道其更改

“更改volatile字段是否会更新对象?”为什么不这样做?更改非易失性字段不起作用。