原帖地址:http://java.ociweb.com/mark/clojure/article.html#Concurrency
作者:R. Mark Volkmann
译者:RoySong
并发(concurrency)
维基百科上面对并发有一个精确的定义:“并发是一种系统属性,支持多条指令实时交叉运行,并且有可能会
相互影响。而交叉的指令可能会在同一CPU的不同核心中的抢占式分时线程中执行,或者在不同的物理上分离的
CPU中执行。”并发编程的主要难度在于管理可变的共享状态。
采用锁机制来管理并发是艰难的。它需要决定哪些对象需要加锁以及什么时候需要加锁,当代码产生改动或者
是添加了新代码时,这些决定又需要重新估算。如果一个开发者在对象需要加锁时忘记加锁或者没能在正确的时间
加锁,会产生不可预料的后果,比如死锁(deadlocks
)或者是竞态条件(race conditions
)。如果对象不需要
加锁而对它进行了加锁,则会产生性能惩罚。
支持并发是很多开发者采用Clojure的主要原因。所有数据都是不变的,除非明确采用引用类型,比如:
Var
,
Ref
, Atom
和Agent
来标识为可变。以上这些引用类型都采用了安全的方式来管理共享状态,将在下一节“
引用类型”("Reference Types
")中讨论。
我们能够很容易在一个新线程中运行Clojure函数,包括用户自定义的有名字的或者匿名的函数。之前在“Java
交互”("Java Interoperability
")章节中已经讨论过了。
因为Clojure能够使用所有的Java类和接口,所以它也能使用所有的Java并发功能。在
"Java Concurrency In Practice
"书中包含了很多这方面的例子。这本书中有很多采用Java管理并发的良好建议,
但是要遵循这些建议并不是那么简单。在大多数情况下,采用Clojure的引用类型比采用Java并发要轻松得多。
除了引用类型之外,Clojure还提供了很多函数来帮助Clojure代码在多线程中运行。
future宏能够让它内部的表达式在线程池(
CachedThreadPool
)中不同的线程中运行,
Agents
也同样采用了
线程池。这对于某些需要长时间运行而不需要即时得到返回结果的表达式是非常有用的。表达式的结果会被保存在
一个非关联对象中由future返回。如果
future宏主体还没执行完毕,而已经需要结果,当前的线程就阻塞直到返回
结果为止。当代理线程池中的某条线程使用完毕后,应该在某个点上调用shutdown-agents来使线程停止和应用程序
退出。
为了论证future的使用,在
"Defining Functions
"章节末尾,一个println函数添加到derivative函数中。它帮助
确认了future啥时候被执行。注意下面代码输出结果的顺序:
(println "creating future")
(def my-future (future (f-prime 2))) ; f-prime is called in another thread
(println "created future")
(println "result is" @my-future)
(shutdown-agents)
如果f-prime函数并没有很快地结束,那么代码的输出将会是:
creating future
created future
derivative entered
result is 9.0
pmap函数实现了并发地将某个函数应用于某个集合的每个元素。当函数应用的时间消耗超过了线程管理的日常开支时,
采用pmap能够比
map获得更好的性能表现。
clojure.parallel命名空间提供了更多的函数来帮助实现并发代码。它们包含
par
,
pdistinct
,
pfilter-dupes
,
pfilter-nils
,
pmax
,
pmin
,
preduce
,
psort
,
psummary和
pvec。
分享到:
相关推荐
史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程
- **Clojure**作为一种功能强大且灵活的函数式编程语言,在JVM上运行具有独特的优势。它不仅支持高效的函数式编程,还具备出色的并发编程能力,使其成为开发高性能、高并发系统的理想选择。 - 对于希望深入了解函数...
Clojure是一种运行在Java虚拟机(JVM)上的动态函数式编程语言,它属于Lisp家族。Clojure的设计哲学强调了函数作为一等公民的地位,以及数据的不可变性,这些特性使得Clojure在处理并发编程和数据密集型应用时表现...
clojure-utils, 各种小型但方便的clojure实用程序函数库 各种小型但方便的Clojure实用程序函数库特别关注:Clojure.java - 用于从Java调用Clojure的实用工具函数的Java类arrays.clj - 操作Java数组core.clj - 应该在...
1. **Clojure编程语言**:Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机(JVM)上。它强调 immutability(不可变性)、concurrency(并发性)和functional programming(函数式编程)特性。 2. **函数...
Scala和Clojure都是现代函数式编程语言,它们都运行在Java虚拟机(JVM)上,能够利用Java的生态系统和资源。Scala是一种多范式语言,结合了面向对象和函数式编程的特点,提供了强大的类型系统和模式匹配功能。...
Clojure是一种基于Lisp的现代函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java平台的强大功能。SHA-3,全称为Secure Hash Algorithm 3,是美国国家标准与技术研究所(NIST)发布的一种密码散列函数标准...
Lisp是一种古老的函数式编程语言,其主要特点是使用S-表达式(Symbolic Expression)表示数据和程序。Lisp的数据结构核心是列表,而列表是通过递归定义的,这使得在Lisp中实现递归算法变得十分自然。它的宏系统允许...
clojure-1.5.1.jar
8. **函数式编程语言**:一些语言天生就是函数式的,如Haskell、Lisp和Clojure;还有一些语言虽然不是纯函数式的,但支持函数式编程特性,如Python、JavaScript和Scala。 9. **monads(范畴论)**:在高级函数式...
虽然Java本身不是一种函数式编程语言,但是JVM强大的生态系统为运行函数式编程语言提供了坚实的基础。 本书的作者Michael Bevilacqua-Linn通过自己的经验,结合了多个编程实践者的点评,将关于Scala和Clojure中函数...
Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java的生态系统。这个“clojure-basics-源码.rar”压缩包很可能是包含了一些基本Clojure编程概念的示例代码或者教程。虽然没有具体...
Clojure是一种功能强大的Lisp方言,它在Java虚拟机(JVM)上运行,并且具有丰富的函数式编程特性。这个压缩包"clojure-must-watch-源码.rar"似乎包含了与Clojure相关的源代码,可能是为了帮助学习者深入理解Clojure...
Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java生态系统的优势。这个压缩包很可能是Clojure 1.6.0-RC3的源代码发布,开发者可以下载、编译和测试以确保其稳定性和兼容性。 ...
Clojure入门介绍: Clojure - Functional Programming for the JVM
Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java的生态系统。Clojure的设计目标是提供一种静态类型的、并发的、内存安全的语言,同时保持Lisp的简洁性和灵活性。在这个压缩包...
- **Lisp**及其衍生语言(如Scheme和Clojure):历史悠久的函数式编程语言,支持宏定义等高级特性。 - **Scala**:结合了面向对象和函数式编程特性的多范式语言。 - **Erlang**:强调并发处理和分布式系统的函数式...
5. Clojure:基于JVM的动态类型语言,支持函数式编程和基于宏的 metabrogramming。 Java平台的多语言混合编程的未来发展趋势是: 1. 软件项目的未来在于混合语言编程,Java仍将是JVM生态系统中的重要组成部分。 2....
该版本为稳定版,将zip文件解压,放到某个指定目录,cd进入这个目录,执行以下命令即可java -cp clojure-1.5.0.jar clojure.main。...当今最主流的运算平台JVM,把函数式编程语言引入JVM也是新方向。
《Programming Clojure 第三版》是一本深入探讨Clojure编程语言的专业书籍,旨在帮助开发者全面理解和掌握这门基于Lisp的现代函数式编程语言。Clojure是由Rich Hickey设计的,它运行在Java虚拟机(JVM)上,同时也...