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