更改volatile字段会更新对象吗?

时间:2017-09-13 12:28:39

标签: 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();

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

您的示例将受Race condition的约束,因为它取决于每个线程执行相关操作所花费的时间,但假设不是问题 ,然后是的,你会在JVM中获得该变量的最新版本,因为它没有缓存在线程本地内存中

答案 2 :(得分:1)

$scope.makeLive = function (row, index) { if ($window.confirm("Sure to make it live?Can't edit after making it live.") === true) { alert("id====" + row.entity.id); } else { $scope.checkboxValue[index] = false; return false; } }; 只返回响应吗?如果是,那么是 - 如果线程A修改guardian.getResponse()并且线程B之后调用guardian.response,则线程B将看到新值。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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