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