作为我正在进行的一项研究的一部分,我正在探索使用 Scala 和 Clojure 等语言在 JVM 上实现并发的所谓简单性。简单来说,我希望证明这些语言提供的并发构造比 Java 7 提供的更简单。
因此,我希望找到一些很好的参考资料来解释 Java 并发模型的复杂性。
除了将我指向谷歌的方向(我已经搜索过,但成功有限)之外,如果那些知情人士能给我提供一些很好的参考资料,让我在这个领域起步,我将不胜感激。
谢谢
作为我正在进行的一项研究的一部分,我正在探索使用 Scala 和 Clojure 等语言在 JVM 上实现并发的所谓简单性。简单来说,我希望证明这些语言提供的并发构造比 Java 7 提供的更简单。
因此,我希望找到一些很好的参考资料来解释 Java 并发模型的复杂性。
除了将我指向谷歌的方向(我已经搜索过,但成功有限)之外,如果那些知情人士能给我提供一些很好的参考资料,让我在这个领域起步,我将不胜感激。
谢谢
虽然高级语言更容易使用多核,但经常被遗忘的是为什么要使用多核以使程序更快,例如增加其吞吐量。
当您考虑增加并发性的选项时,您需要测试这些选项是否真的以某种方式提高了性能。(因为很多时候他们不这样做)
例如,STM(软件事务内存)可以更轻松地编写多线程应用程序,而不必担心并发问题。问题在于,对于简单的例子,不使用 STM 而只使用一个线程会更快。
使用多线程会增加复杂性并使您的应用程序更加脆弱,因此必须有充分的理由这样做,否则您应该坚持尽可能简单的解决方案。
更多讨论 http://vanillajava.blogspot.co.uk/2011/11/why-concurency-examples-are-confusing.html
Java 不支持 lambda 表达式。创建内联回调(例如,用于完成异步调用)需要 5 行匿名类型的样板代码。
这强烈阻止人们使用回调。这可能就是为什么 Java 7 仍然没有接受一个值的回调接口(与Runnable
and相对),而 C#自 2005 年以来Callbable
就有一个。
因此,JDK 对异步操作没有任何真正的支持。
异步操作的关键是能够启动长时间运行的请求,并在完成时运行回调,而在请求期间不消耗线程。在 Java 中,您只能通过get()
对Future<V>
. 这将使用标准 API 的应用程序的并发性限制为您可以正常支持的线程数。
为了解决这个问题,Google 的用于更好 Java 代码的 Guava 框架引入了一个具有完成回调的ListenableFuture<V>
接口。
像 Scala 这样的语言通过支持 lambda 表达式(编译为匿名类)并添加自己的Promise / Future类型来解决这个问题。