2

我只是听到并看到人们说 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 不能解决多线程中的所有问题。)

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

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

Scala 看起来像是多种语言的混合体,使用这种方法可以更容易地解决这方面的问题?

更新

感谢您从不同角度的出色回答。我觉得他们都很好。不管你站在哪一边。

编辑

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

有关的:

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

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

4

3 回答 3

6

我并不是这方面的专家,但 Scala 是(至少部分地)一种函数式编程语言,而 Java 不是(它是命令式的)。函数式编程的一个特点是它避免了(以“自然”的方式)副作用。

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

于 2011-08-20T12:37:56.350 回答
3

就像今天一样,我发现 Scala在处理多线程方面比 Java差得多。

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

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

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

于 2011-08-20T13:22:20.240 回答
2

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

像 Actors/Reactors 这样的抽象,它们是框架的一部分(不是语言),完全解放了开发人员来直接处理线程和临界区同步。更重要的是:从 2.9.x 开始,并行集合直接包含在库中。

于 2011-08-20T14:37:18.557 回答