1

我一直在比较 Scala 在并发编程方面相对于 Java 的优势。

显然我想到的第一点是Scala 是一种函数式编程语言(部分)使用 FP 自然地避免了副作用

与命令式语言相比,函数式编程如何避免副作用以及它如何在多线程/并发编程中工作?

4

1 回答 1

5

我认为,这句话的意思是,Scala 作为一种函数式-OO混合语言鼓励(有时允许)你使用不会产生副作用的函数式构造和规则。您可以很好地编写具有副作用的非功能性有状态 Scala 代码;-) 另一方面,您可以尝试编写功能性 Java(例如),但由于函数不是第一类对象,因此它可能看起来很难看。所以我不会说它这样做很自然,但更像是在某些方面帮助你,并且总体上鼓励你这样做。

好吧,在进行函数式编程时,您应该坚持几个原则,结果不会给您带来任何副作用:

  • 不可变是好的 - 更喜欢一旦创建并且无法修改的结构。例如,在 Java 列表中,您可以修改第 n 个元素,但在 Scala 中,您返回该列表的副本以及新元素。是的,这可能意味着您的程序中有更多的对象,但也应该产生更多可重用和更安全的代码。
  • 将值作为参数传递,不要将状态存储在成员变量中 - 共享状态是许多问题的原因,管理共享状态是有问题的(例如,您需要使用锁等)
  • 如果价格便宜,则更喜欢重新计算值,而不是缓存它们(这有一些规则例外,例如http://en.wikipedia.org/wiki/Memoization是一种非常常用的技术!)

实际上,遵循上述规则避免副作用的最大好处之一就是更容易并发编程!毕竟,并发编程的最大障碍是管理共享状态!

由于其中一条规则是可变和共享状态不好,因此您不要使用它!相反,许多函数式语言(例如 Erlang 或 Scala)更喜欢所谓的 Actor 模型,其中 Actor(您可以将其与线程进行比较)仅通过相互发送消息进行通信(参见?传递值而不是将它们存储在某个地方!)。

于 2013-10-14T06:37:41.390 回答