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

时间:2016-01-10 06:09:22

标签: java scala apache-spark singleton

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

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对象的行为不像单身?

1 个答案:

答案 0 :(得分:2)

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

object SparkContextLoader {

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

  val sc = new SparkContext(sparkConf)
}

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

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