Dagger 2 中的@Singleton 线程安全吗?

is @Singleton in dagger 2 thread safe?

我正在尝试将应用程序中的所有内容从单例中移开,因为我已经意识到这是一种糟糕的编程习惯,话虽如此,我正在考虑实施 Dagger 2 依赖项注入。我想知道,当你在 Dagger 2 中执行 @Singleton 时,线程是否同步?如果不是,我该如何同步它,这样我就不会从多个线程接触相同的东西时得到任何奇怪的数据异常。

当我在创建单例之前我会做这样的事情:

public class SomeSinglton {
    private static ClassName sInstance;

    private SomeSinglton () {
    }

    public static synchronized ClassName getInstance() {
        if (sInstance == null) {
            sInstance = new ClassName();
        }
        return sInstance;
    }

就同步而言,Dagger 2 @Singleton 是否等效?

this site 抢劫。有不同的方法来实现 Singleton,其中包括 ThreadSafeSingleton

单例没有错。但这是 更好的 实现。

public class SomeSinglton {
    private static ClassName sInstance = new SomeSinglton();

    private SomeSinglton () {
    }

    public static ClassName getInstance() {
        return sInstance;
    }

初始化静态字段 sInstance 时存在隐式同步。

正如 Artem Zinnatullin 在他的回答中提到的那样——@Singleton 的实例创建 classes 在 Dagger 中是线程安全的。

但是如果你要从不同的 theads 中访问那个单例,你必须自己让它线程安全。否则 Dagger 不会帮助你。

通常,@Singleton 注释应该对其他开发人员意味着这样的 class 可以从不同的线程使用。

是的,Dagger 2 中的 @Singletons 是线程安全的,具有双重检查锁定,在 Dagger 1 中也是如此。参见 ScopedProvider