在MultiThread方面比较java和scala

时间:2011-08-20 12:18:32

标签: java multithreading scala concurrent-programming

我只是听到并看到有人说scala是为MultiThread设计的,尽管它实际上是出于通用目的。

它声称“事情是,虽然你可以在Java中创建线程安全的类(如果你知道你正在做什么),Scala使它变得容易和自然。”

确实AKKA和Lift是用scala编写的(实际上是java和scala)

但java在java.util.concurrent的新包中也在这方面做了改进。 那么为什么AKKA和Lift出生在JAVA?

也许你会说scala使java看起来像C.: - )

任何人都可以对此有更深入的了解或更深入的想法吗?

我知道可以混合使用JAVA和scala。 Scala能够无缝地调用Java代码。那么java有什么,scala也是如此。

但是,无论语法不同,scala真正改进了java还没有做过什么?

只有像Actors / Agents这样的设计或其他什么? (注意Actors / Agents无法解决MultiThread中的所有问题。)

或者scala编译器和采用一些函数式语法语法真的比java更重要或帮助吗?

我听到一些消息称scala将能够采用XText。为了能够利用XText编写线程逻辑,不确定这是否属实。

Scala看起来像是语言的混合物,使用这种方法可以更加可扩展地解决这方面的问题吗?

更新

感谢您从不同角度出色的答案。我认为他们都非常好。无论你站在哪一边。

修改

下面的主题(在一年前的SO中)询问了类似的事情。 “建设性”结论非常相似。但这一次,一些新的观点可能会出现,我要问的方式有点不同。仅供参考。

相关:

其实我很感兴趣,有些人可以用一些全新的角度回答这个问题,这可以启发我的思想,提供一些未知的想法。

但由于没有建设性,它已经关闭了。 : - )

3 个答案:

答案 0 :(得分:6)

我并不是真正的专家,但Scala是(部分至少)一种函数式编程语言,而Java则不是(这是必要的)。函数式编程的一个特征是它避免(以“自然”方式)副作用。

另一方面,线程安全性几乎是避免副作用(即不同的线程同时修改相同的对象/部分内存/其他资源)。

答案 1 :(得分:3)

就像今天一样,在使用多个线程方面,我发现Scala比使用Java更糟糕。

语言规范没有定义一些你需要依赖的非常重要的东西来制作线程安全的代码。

例如,在处理多个线程时,您应该知道final实例字段非常特殊。保证在构造函数完成后,所有线程都可以看到它们的初始值,即使该对象是在竞争条件下发布的。

Scala不保证将val编译为final字段。情况通常如此,但由于规格没有明确说明,你不能认为这是理所当然的。因此,要么编写在Java中不存在的样板同步代码,要么编写不保证线程安全的代码(并希望编译器继续将val映射到最终字段)。

答案 2 :(得分:2)

我认为这不是实际语言的问题,而是更多关于应用简化并发编程的原则,例如:不分享任何东西,消息传递,不可变对象,无副作用的函数等.Scala不是最严格意义上的FP语言,但它提供了对函数式编程技术的访问。

作为框架(非语言)一部分的Actors / Reactors之类的抽象,完全让开发人员可以直接处理线程和关键部分同步。更重要的是:从2.9.x开始,并行集合直接包含在库中。