共享val可以成为性能的瓶颈吗? - 斯卡拉

时间:2013-09-24 09:32:31

标签: performance scala concurrency

我们有一段带有静态字段val format = DateTimeFormatter.forPattern("yyyy-MM-dd")的代码 现在,并发线程将使用此格式化程序实例来解析和打印日期format.parseDateTime("2013-09-24")format.print(instant)。 我了解到,在Scala中,您可以编写代码而无需考虑并发性,前提是您只使用不可变字段,但性能如何呢?如果多个线程使用相同的实例,它会成为瓶颈吗? 谢谢,

2 个答案:

答案 0 :(得分:3)

您的问题与Java有关。如果forPattern方法的实现是线程安全的,您可以在多个线程之间共享它而没有任何瓶颈。

检查javadoc以查看实现是否是线程安全的。在您的具体情况下,我将假设您使用的是JodaTime库:

摘自DateTime Javadoc

  

DateTimeFormat是线程安全且不可变的,它返回的格式化程序也是如此。

有一个反例,请参阅SimpleDateFormat javadoc:

  

日期格式未同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问某个格式,则必须在外部进行同步。

使用val只意味着变量引用在声明后不会改变。见What is the difference between a var and val definition in Scala?

答案 1 :(得分:0)

看起来你错误地解释了它:Scala中的并发性非常像Java(或任何其他语言),并没有什么特别之处。只是它提供了替代库和语法糖,以便用更少的锅炉板完成它们,更重要的是确保安全地完成它们(例如:akka)。

但其他原则如:依赖核心数量,线程池大小,上下文切换等等都必须得到处理和处理。

现在问一个问题,即多个线程访问的不可变val是否会降低性能:我不认为应该有任何开销,我也没有数据支持。但我认为性能可能很好,因为处理器可以缓存它,同一个对象可以在另一个核心中更快地检索。