gpt4 book ai didi

scala - Scala 中的并发原语

转载 作者:行者123 更新时间:2023-12-02 19:48:41 25 4
gpt4 key购买 nike

对于访问 CPU 密集型对象(没有 IO 和网络)来说,什么是好的并发原语?

例如,有一个 FooCounter,它具有用于 var counter: Int 的 get()、set() 和 inc() 方法,在成千上万个线程之间共享。

object FooCounter{
var counter: Int = 0;
def get() = counter
def set(value: Int) = {counter = counter + value}
def inc() = counter + 1
}

我发现大多数关于 Scala 的文献都是针对 Akka 的。对我来说,Actor 模型似乎不太适合这项任务。

还有 Futures/Promise,但它们对于阻塞任务很有用。

在 Java 中,有一个很好的使用锁存器的原始 Atomics,它对于这项任务来说非常健壮和下降。

更新:我可以使用 Java 原语来完成这个简单的任务。然而,我的目标是在这个简单的示例中使用和学习 Scala 并发模型。

最佳答案

您应该知道您的 FooCounter 实现不是线程安全的。如果多个线程同时调用 getsetinc 方法,则无法保证计数准确。您应该使用以下实用程序之一来实现正确的并发计数器:

  • synchronized 语句(Scala synchronized 语句类似于 one in Java )
  • atomic variables
  • STM(例如 ScalaSTM)
  • 您可能可以使用作为计数器的 Akka actor,但请注意,这不是 actor 最直接的应用

其他 Scala 并发实用程序,例如 futures 和 Promise、并行集合或响应式(Reactive)扩展,并不是最适合实现并发计数器,并且具有不同的用途。

您应该知道 Scala 在某些情况下会重用 Java 并发基础设施。例如,Scala 不提供自己的原子变量,因为 Java 原子类已经完成了这项工作。相反,Scala 的目标是提供更高级别的并发抽象,例如 Actor、STM 和异步事件流。

基准测试

要评估实现的运行时间和效率,一个不错的选择是 ScalaMeter 。该网站上的在线文档包含有关如何进行基准测试的详细示例。

文档和并发库

虽然 Akka 是最流行且文档最齐全的 Scala 并发实用程序,但还有许多其他高质量的实现,其中一些更适合不同的任务:

我认为Learning Concurrent Programming in Scala对你来说可能是一本好书。它包含 Scala 中不同并发样式的详细文档,以及何时使用哪种并发样式的说明。第 5 章和第 9 章还讨论了基准测试。具体来说,本书的第 9 章描述、优化了并发计数器实用程序,并使其可扩展。

免责声明:我是作者。

关于scala - Scala 中的并发原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26902794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com