为什么要在返回之前将 volatile 分配给局部变量
Why would you assign volatile to local variable before returning
在查看 android LiveData 的实现时,我偶然发现了以下代码片段
public T getValue() {
Object data = mData;
if (data != NOT_SET) {
return (T) data;
}
return null;
}
为什么要在返回之前将 class 成员分配给局部变量?我猜这与 mData
是 volatile
这一事实有关,但我无法完全理解为什么我们不能 return mData
.
我们想要 return mData
,除非它等于 NOT_SET
,因为那时我们想要 return 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
块内,returns (T) mData
,即 NOT_SET
。但在这种情况下,调用者期望 null
!
事实上,无论 mData
是否为 volatile
,这都可能发生。 volatile
关键字就是 more likely.
在查看 android LiveData 的实现时,我偶然发现了以下代码片段
public T getValue() {
Object data = mData;
if (data != NOT_SET) {
return (T) data;
}
return null;
}
为什么要在返回之前将 class 成员分配给局部变量?我猜这与 mData
是 volatile
这一事实有关,但我无法完全理解为什么我们不能 return mData
.
我们想要 return mData
,除非它等于 NOT_SET
,因为那时我们想要 return 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
块内,returns(T) mData
,即NOT_SET
。但在这种情况下,调用者期望null
!
事实上,无论 mData
是否为 volatile
,这都可能发生。 volatile
关键字就是 more likely.