如何解决为什么在返回之前将 volatile 分配给局部变量
在查看android LiveData的实现时,我偶然发现了以下代码片段
// ...
TextField(
decoration: InputDecoration(
// This indeed updates `helperText`,but also changes the label padding
// contentPadding: EdgeInsets.zero,border: const OutlineInputBorder(),labelText: 'My Label Text',helperText: 'My Helper Text',),// ...
为什么要在返回之前将类成员分配给局部变量?我的猜测是这与 import py_eureka_client.eureka_client as eureka
registry_client,discovery_client = eureka.init(eureka_server="http://127.0.0.1:8761",app_name="django-app",instance_port=8088)
是 public T getValue() {
Object data = mData;
if (data != NOT_SET) {
return (T) data;
}
return null;
}
的事实有关,但我无法完全理解为什么我们不能只是 mData
。
解决方法
我们想要返回 mData
,除非它等于 NOT_SET
因为那样我们想要返回 null
。想象一下,如果天真地写成这样:
public T getValue() {
if (mData != NOT_SET) {
return (T) mData;
}
return null;
}
问题在于根本没有同步,因此通过读取 mData
两次,我们创建了竞争条件。如果发生以下一系列事件怎么办?
-
mData
包含一些不是NOT_SET
的值,所以mData != NOT_SET
通过,我们进入if
块。 - 另一个线程出现并设置了
mData = NOT_SET;
。 - 现在位于
if
块内的第一个线程返回(T) mData
,即NOT_SET
。但在这种情况下,调用者期望null
!
事实上,无论 mData
是否为 volatile
,这都会发生。 volatile
关键字只是使它成为 more likely。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。