12

我正在尝试将我的应用程序中的所有内容从单例中移开,因为我已经意识到这是一种糟糕的编程习惯,也就是说,我正在研究实现 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 是否等效?

4

4 回答 4

13

@Singleton的,Dagger 2 中的 s 是带有双重检查锁定的线程安全的,在 Dagger 1 中也是如此。请参阅ScopedProvider

于 2015-12-24T12:16:42.893 回答
1

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

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

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

于 2015-05-14T15:09:12.723 回答
-2

这个网站上掠夺。实现 Singleton 有不同的方法,其中 ThreadSafeSingleton

于 2015-05-14T14:54:59.583 回答
-3

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

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

    private SomeSinglton () {
    }

    public static ClassName getInstance() {
        return sInstance;
    }

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

于 2015-05-14T14:59:57.830 回答