我一直在比较Scala在并发编程方面优于Java的优势。
显然,我得出的第一点是Scala是一种函数式编程语言(部分使用FP自然避免了副作用)
与命令式语言相比,函数式编程中如何避免副作用以及它如何在多线程/并发编程中工作?
我认为,这句话的意思是,Scala作为一种函数式OO混合语言鼓励(有时使你能够)使用函数式结构和规则,这不会产生副作用。你可以很好地编写带有副作用的非功能性有状态 Scala 代码;-)另一方面,您可以尝试编写函数式Java(例如),但由于函数不是第一类对象,因此它可能看起来很丑陋。所以我不会说它自然而然地这样做,但更像是在某些方面帮助你,总体上鼓励你这样做。
好吧,在进行函数式编程时,您应该坚持几个原则,因此不会给您带来任何副作用:
- 不可变是好的 - 更喜欢一旦创建且无法修改的结构。例如,在 Java 列表中,您可以修改第 n 个元素,但在 Scala 中,您可以返回包含新元素的列表的副本。是的,这可能意味着程序中有更多的对象,但也应该产生更可重用和更安全的代码。 将
- 值作为参数传递,不要将状态存储在成员变量中 - 共享状态是许多问题的原因,管理共享状态是有问题的(例如,您需要使用锁等)
- 如果值便宜,则更喜欢重新计算值,而不是缓存它们(例如,这有一些规则的例外 http://en.wikipedia.org/wiki/Memoization 这是一种非常常用的技术!
实际上,通过遵循上述规则避免副作用的最大好处之一是更容易并发编程!毕竟,并发编程中最大的障碍是管理共享状态!
由于规则之一是可变和共享状态是不好的,因此您不要使用它!相反,许多函数式语言(如Erlang或Scala)更喜欢所谓的Actor模型,其中Actor(您可以将其与线程进行比较)仅通过相互发送消息进行通信(请参阅传递值而不是将它们存储在某个地方!)。