我们有一段带有静态字段val format = DateTimeFormatter.forPattern("yyyy-MM-dd")
的代码
现在,并发线程将使用此格式化程序实例来解析和打印日期format.parseDateTime("2013-09-24")
和format.print(instant)
。
我了解到,在Scala中,您可以编写代码而无需考虑并发性,前提是您只使用不可变字段,但性能如何呢?如果多个线程使用相同的实例,它会成为瓶颈吗?
谢谢,
答案 0 :(得分:3)
您的问题与Java有关。如果forPattern
方法的实现是线程安全的,您可以在多个线程之间共享它而没有任何瓶颈。
检查javadoc以查看实现是否是线程安全的。在您的具体情况下,我将假设您使用的是JodaTime库:
DateTimeFormat是线程安全且不可变的,它返回的格式化程序也是如此。
有一个反例,请参阅SimpleDateFormat javadoc:
日期格式未同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问某个格式,则必须在外部进行同步。
使用val只意味着变量引用在声明后不会改变。见What is the difference between a var and val definition in Scala?
答案 1 :(得分:0)
看起来你错误地解释了它:Scala中的并发性非常像Java(或任何其他语言),并没有什么特别之处。只是它提供了替代库和语法糖,以便用更少的锅炉板完成它们,更重要的是确保安全地完成它们(例如:akka)。
但其他原则如:依赖核心数量,线程池大小,上下文切换等等都必须得到处理和处理。
现在问一个问题,即多个线程访问的不可变val
是否会降低性能:我不认为应该有任何开销,我也没有数据支持。但我认为性能可能很好,因为处理器可以缓存它,同一个对象可以在另一个核心中更快地检索。