0

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

4

2 回答 2

3

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

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

DateTime Javadoc中提取:

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

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

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

使用 val 只是意味着变量引用在他声明后不会改变。请参阅Scala 中的 var 和 val 定义有什么区别?

于 2013-09-24T09:59:48.563 回答
0

好吧,看起来您误解了它:Scala 中的并发非常类似于 Java(或任何其他语言),并没有什么特别之处。只是它提供了替代库和语法糖,可以用更少的样板来完成它们,更重要的是可以安全地完成它们(例如:akka)。

但是其他原则,例如:对内核数量、线程池大小、上下文切换等的依赖都必须得到处理和照顾。

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

于 2013-09-24T10:16:13.367 回答