java - 为什么要在返回之前将 volatile 分配给局部变量

标签 java android android-livedata volatile

在查看 android LiveData 的实现时,我无意中发现了以下代码 fragment

public T getValue() {
        Object data = mData;
        if (data != NOT_SET) {
            return (T) data;
        }
        return null;
    }

为什么要在返回之前将类成员分配给局部变量?我猜这与 mDatavolatile 这一事实有关,但我无法完全理解为什么我们不能 return mData .

最佳答案

我们想要返回 mData,除非它等于 NOT_SET,因为那时我们想要返回 null。想象一下,如果它天真地写成这样:

    public T getValue() {
        if (mData != NOT_SET) {
            return (T) mData;
        }
        return null;
    }

问题是根本没有同步,所以通过读取 mData 两次,我们创建了一个竞争条件。如果发生以下事件序列怎么办?

  1. mData 包含一些不是 NOT_SET 的值,因此 mData != NOT_SET 通过,我们输入 if阻止。
  2. 另一个线程出现并设置 mData = NOT_SET;
  3. 现在位于 if block 内的第一个线程返回 (T) mData,即 NOT_SET。但在这种情况下,调用者期望 null!

事实上,无论 mData 是否为 volatile,这都可能发生。 volatile 关键字使它成为 more likely .

关于java - 为什么要在返回之前将 volatile 分配给局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66493435/

相关文章:

javascript - Phonegap Android Geolocation watchPosition超时

android - 具有多个参数的 MediatorLiveData 或 switchMap 转换

java - 带有 BindingAdapter 的 MutableLiveData 不更新 View 的可见性

java - 运行时生成可执行jar

java - 带空行的 Wildfly 和 logback

java - Java bean 的类型安全属性名称

java - 如何通过 JSch java api 执行 linux 命令 "dzdo su - john"并在该用户上执行一些命令,如 "ls -ltr"

java - 如果我每次都将一个新对象传递给一个方法是不好的做法,因为我正在收集这么多可能不会使用的新对象?

java - 破坏Activity的背景

在 kotlin 中为 recyclerview 实现 MVVM 设计模式