当Java提供并发编程的功能时,使用Clojure(而不是Java)的主要优势是什么?
答案 0 :(得分:18)
Clojure专为concurrency而设计。
Clojure在比Java更高的抽象级别上提供并发原语。其中一些是:
软件事务内存系统,用于处理对共享引用的同步和协调更改。您可以将多个引用更改为原子操作,而不必担心程序中的其他线程正在执行的操作。在您的交易中,您将始终拥有一致的世界观。
异步更改的代理系统。这类似于在Erlang中传递的消息。
将变量的局部更改线程化。这些变量具有根绑定,由程序中的每个线程共享。但是,当您重新绑定变量时,它只会在该线程中可见。
所有这些并发原语都建立在Clojures不可变数据结构(即列表,映射,向量等)之上。当您进入可变Java对象的世界时,所有基元都会崩溃,您将回到锁定和条件变量(必要时也可以在clojure中使用)。
答案 1 :(得分:7)
如果不是Clojure的专家,我会说主要的优点是Clojure隐藏了很多并发编程的细节,而且我们都知道魔鬼在细节中,所以我认为这是一件好事。
您可能想要查看来自Rick Hickey(Clojure的创建者)的this excellent presentation关于Clojure中的并发性。编辑:显然JAOO删除了旧的演示文稿。我还没有找到新的来源。
答案 2 :(得分:6)
因为Clojure基于功能编程范例,也就是说它通过遵循一些简单的规则实现了并发性的安全性:
因此编写的程序几乎内置了水平可伸缩性,而基于锁的并发机制(与Java一样)容易出现涉及竞争条件,死锁等的错误。
答案 3 :(得分:5)
因为过去10年世界已经发展,Java语言(!= JVM)发现很难跟上。 JVM的更多现代语言基于新的想法和改进的概念,使许多繁琐的任务变得更加简单和安全。
答案 4 :(得分:5)
使用不可变类型的一个很酷的事情是大多数内置函数已经是多线程的。简单的“减少”将涵盖多个核心/处理器,无需您进行任何额外的工作。
因此,确保您可以使用Java进行多线程,但它涉及锁等等。 Clojure是多线程的,没有任何额外的努力。
答案 5 :(得分:2)
是的,Java为并发程序提供了所有必要的功能。
类比:C为内存安全程序提供了所有必要的功能,即使有很多字符串处理也是如此。但在C内存安全性是程序员的问题。
实际上,分析并发性非常困难。最好使用固有安全机制,而不是试图预测所有可能的并发危险。
如果您尝试通过添加互锁来使共享内存可变数据结构并发程序安全,那么您正走在走钢丝上。此外,它在很大程度上是不可测试的。
一个很好的折衷方案可能是使用Clojure的功能样式编写并发Java代码。
答案 6 :(得分:2)
除了Clojure通过不可变数据,变量,引用(和软件事务内存),原子和代理进行并发的方法之外......它是一个值得学习的Lisp。您可以获得Lisp宏,解构,第一类函数和闭包,REPL和动态类型 - 以及列表,向量,映射和集合的文字 - 所有这些都在与Java库的互操作性之上(并且还开发了CLR版本)。 )
它与Scheme或Common Lisp并不完全相同,但是如果你想要通过Structure and Interpretation of Computer Programs或者保罗格雷厄姆在essays中谈论的那些,那么学习它会对你有所帮助。可以与XKCD中的this comic相关联。 ; - )
答案 7 :(得分:1)
这个video演示文稿是一个非常强大的案例,围绕作为尝试实现的高效持久数据结构。
答案 8 :(得分:-5)
Java编程语言的发展非常缓慢,主要是因为Sun对后向兼容性的关注。
为什么不想直接使用Clojure和Scala等JVM语言?