如何在Scala中实现一个真正的Singleton

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Scala中实现一个真正的Singleton相关的知识,希望对你有一定的参考价值。

我有混合Java / Scala项目。有一些Quartz作业用Java实现,并使用一些Scala类。这些类应该使用相同的SparkContext实例,所以我实现了一些应该是singleton的东西,如下所示:

object SparkContextLoader {
    var hasSC = false
    var sc:Any = 0
    def getSC(workers):SparkContext={
    if (!hasSC) {
        val sparkConf = new SparkConf().setMaster("local[" + workers + "]").setAppName("SparkApp")
        sc = new SparkContext(sparkConf)
        hasSC = true
    }
    return sc.asInstanceOf[SparkContext]
}

从两个不同的作业调用SparkContextLoader总是会创建一个不允许的新SparkContext实例。

为什么Scala对象不像单例一样?

答案

您的代码过于复杂。如果“两个不同的工作”是不同的线程,那么你需要的只是:

object SparkContextLoader {

  val sparkConf = new SparkConf().setMaster("local[" + workers + "]").setAppName("SparkApp")

  val sc = new SparkContext(sparkConf)
}

然后,您可以使用this question的答案访问这些val。

如果“两个不同的工作”是不同的java应用程序,那么it doesn't seem有一种方法可以在两者之间共享一个单例。

以上是关于如何在Scala中实现一个真正的Singleton的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scala 中实现 Kafka Consumer

您将如何在 Scala 中实现缓存方面

如何在 Scala 中实现 DAO?

Scala - 如何在 Spark 的 map 函数中实现 Try

如何在 spark scala 中实现 uniqueConcatenate、uniqueCount [关闭]

如何在火花聚合函数中实现scala类型安全