如何在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 - 如何在 Spark 的 map 函数中实现 Try