【问题标题】:Compare java and scala in MultiThread aspect [closed]在多线程方面比较 java 和 scala [关闭]
【发布时间】:2011-10-31 04:41:23
【问题描述】:

我只是听到并看到有人说 scala 是为多线程设计的,尽管它实际上是为通用目的而设计的。

它声称“问题在于,虽然您可以在 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)正在询问类似的事情。 “建设性”的结论非常相似。但是这一次,一些新的观点出来了,可能我问的方式有点不同。仅供参考。

相关:

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

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

【问题讨论】:

  • @Mchi 你能用几句话解释一下你的想法吗?
  • 实际上,我不喜欢 Scala 的一个方面是使用多线程。我永远不知道到底发生了什么。我错过了语言规范中关于visibility 的一些精确性。例如,规范不保证案例类中的 val 将被编译为 final 字段(通常是这样)......如果你不能做出这个假设,你必须添加样板同步的loooots代码只是为了确定。或者,如果由于某种原因,编译器决定不添加 final 修饰符,您也可以编写一些可能完全被破坏的代码。这种缺乏精确性让我感到厌烦
  • @Bruno 你的话给了我一些提示。如果语言编译器可以更聪明地告诉程序员你的代码不是线程安全的。那么我会非常喜欢它。 :-)

标签: java multithreading scala concurrent-programming


【解决方案1】:

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

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

【讨论】:

  • +1 我认为这可能是一个很好的答案。我错过了这个因素。 Java 从来都不是一种函数式语言。
【解决方案2】:

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

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

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

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

【讨论】:

  • +1 非常不同的答案。我猜马丁奥德斯基在阅读您的答案时会晕倒。 :-) 它起源于使多线程程序员容易。
  • 您可以确定他和他的团队很久以前就意识到了这一点。我真的很想知道选择不明确说明这些事情的理由。
  • 有一个对字节码没有影响的关键字有什么意义?
  • @Mchl - 它可能会阻止您编译一个类,在该类中您将值重新分配给标记为 final 的字段,并允许编译器优化
  • 规格中是否添加了保证?反对票有什么用?人们被这个答案冒犯了?
【解决方案3】:

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

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

【讨论】:

  • 为什么java不能采用这些原则?但是,您对图书馆的差异是正确的。但是你必须承认scala是一种语言而不是框架。如果scala是一个框架,我不需要问这个问题。
  • 我猜,他们可以。但恕我直言,Scala 让它变得更简单,感觉更“自然”。我还要说,到目前为止,高阶函数是 Java 缺少的关键方面。
  • 恕我直言,原则是设计中普遍和普遍的概念。它不决定哪种语言更合适。相反,它应该适合所有语言。所以也许 scala 只是走得更远。
  • 一句话,主体高于语言。
  • 说得好。但是正确的工具难道不能简化原则的应用吗?我认为 Scala 语言与其库结合提高了一些重要的抽象级别,因此人们不必(或更少)担心细节问题。
猜你喜欢
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多