【问题标题】:is @Singleton in dagger 2 thread safe?匕首 2 线程中的 @Singleton 是否安全?
【发布时间】:2015-07-26 05:55:32
【问题描述】:

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

【问题讨论】:

  • 您确定该方法需要同步,而不是 sIntance?也许我错了,但根据我的经验,我会说同步不在正确的地方,但如果我错了,我想知道为什么

标签: java android multithreading thread-safety dagger-2


【解决方案1】:

抢劫this site。实现 Singleton 有多种方法,其中 ThreadSafeSingleton

【讨论】:

  • 这应该是一条评论。除了链接之外,它没有提供问题的真正答案。
【解决方案2】:

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

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

    private SomeSinglton () {
    }

    public static ClassName getInstance() {
        return sInstance;
    }

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

【讨论】:

  • 我认为这不能回答我的问题...我指的是使用 Dagger 2 库进行依赖注入。而且我现在在太多地方读到单例很糟糕......它们很糟糕,因为它们很难进行联合测试,并且因为它们紧密耦合组件。另外,我很确定您在该示例中的代码不是线程安全的。它不同步。我认为这会在多线程应用程序中导致很多问题。
  • 我敢打赌该库正确地实现了它。而且我向你保证,我的 impl 是正确的并且更好 :) 相信我。
  • 关于单身人士是否不好——你个人有没有遇到过单身人士的问题?一个观点重复一百万次也不会变得更正确;不幸的是,这在我们的行业中经常发生。
  • 您能解释一下您的实现如何更好吗?是的,我遇到了单身人士的麻烦。我在一个安卓应用程序中使用过它们。它们引起了很多奇怪的状态问题,但它们也很难测试。我已经开始联合测试我的应用程序,并意识到单例几乎是不可能的。我认为你是对的,虽然单例本身并不坏,但我确实认为它们促进了懒惰的编程,至少在我的情况下是这样的。
  • 感谢您澄清您的实施。很高兴知道。我不知道有隐含的同步。
【解决方案3】:

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

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

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

【讨论】:

  • 谢谢。那是我应该在模块中还是在模块生成的类中实现的东西?
  • 这应该和类直接相关。我建议您阅读有关 java 并发性以及如何制作线程安全代码的内容。同步整个班级通常是个坏主意。
  • 这不是真的,@SIngletons 在 Dagger 2 中是线程安全的,请参阅下面的答案。
  • 其实我的意思不是类的实例创建,而是使用。尽管创建是线程安全的,但从多个线程使用该实例仍然不是线程安全的。我会修改我的答案。谢谢。
  • 啊,明白了,当然,没有魔法,如果你将对象共享给多个线程,它必须是线程安全的。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多