【问题标题】:Synchronized singleton in KotlinKotlin 中的同步单例
【发布时间】:2019-11-11 11:40:03
【问题描述】:

我是 Kotlin 的新手。仍在学习基本语法。 我听说过类似于 Java 中静态的伴随对象。但不知道如何在 Kotlin 中创建同步单例。

【问题讨论】:

  • 同步单例是什么意思?在 Java 中是这样的:class Foo { private static Foo instance; public static synchronized Foo getInstance(){ if (instance == null){instance=new Foo();} return instance; } }
  • @fgasparini.. 是的。

标签: android kotlin singleton synchronized


【解决方案1】:

我想,再多研究一点,我就找到了。这是如何做到的。如果可以以更好的方式完成,请纠正我。

companion object {
@Volatile private var INSTANCE: Singleton ? = null
 fun  getInstance(): Singleton {
         if(INSTANCE == null){
             synchronized(this) {
                 INSTANCE = Singleton()
             }
         }
         return INSTANCE!!
   }
}

【讨论】:

  • @fgasparini,如果有更好的方法,请您提出建议。
  • 那绝对行不通。您需要在同步块内进行第二次空检查。 ...你可能想看看portabledroid.wordpress.com/2018/08/09/…
  • @G.BlakeMeike...您能否编辑或发布更正的代码
  • 双重检查锁定已在多年前被证明是行不通的。 Kotlin 在 JVM 上运行。也不适用于Java。单例模式是一种名誉扫地的模式。
【解决方案2】:

随便用

object Singleton {
    // any members you need
}

已经正确同步:

Object declaration's initialization is thread-safe.

请注意,这并不能保证其上的 调用 是线程安全的,但这就像在 Java 中一样。

【讨论】:

  • OP 似乎希望他的单身人士变得懒惰。这个不是。
  • @G.BlakeMeike 实际上是;它会在它的类被加载时被初始化,并且这只发生在它第一次被访问时。
  • @G.BlakeMeike 这也适用于 Java:stackoverflow.com/questions/15019306/…
  • 没错。加载类时,第一次命名该类。从 OP 似乎想要的意义上说,这并不懒惰。
  • @G.BlakeMeike 你的意思是Java代码可以有其他static成员,无需调用getInstance()就可以访问?在 Kotlin 中,这仅对应于将它们放在另一个 object(包括嵌套的)上。
【解决方案3】:

还有其他方法,但是这两种是最简单的生成单例类的方法

方法 1- Kotlin 方式

object SingletonObj {
    init {
        // do your initialization stuff
    }
}

方法 2- Kotlin 中的双空检查方式

class SingletonObj {
    private constructor(context: Context)

    companion object {
        @Volatile private var mInstance: SingletonObj? = null

        public  fun get(context: Context): SingletonObj =
            mInstance ?: synchronized(this) {
                val newInstance = mInstance ?: SingletonObj(context).also { mInstance = it }
                newInstance
            }
    }
}

【讨论】:

【解决方案4】:

线程安全和惰性:

class Singleton private constructor() {
    companion object {
        val instance: Singleton by lazy { Singleton() }
    }
}

已经在 by lazy 内部实现了双重空检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多