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字段是否会更新对象?”为什么不这样做?更改非易失性字段不起作用。