Clojure并发编程与特性解析
1. 并发编程中的邪恶之源与Clojure的应对
在并发对象导向系统的开发中,可变状态就如同隐藏在程序核心的邪恶力量。许多语言采用不同的方法来处理可变状态。例如,Io和Scala使用基于参与者的模型,并提供不可变结构,让程序员无需可变状态就能解决问题;Erlang则通过轻量级进程和虚拟机器,实现有效的监控和通信,保证了前所未有的可靠性。
Clojure采用了软件事务内存(STM)的方法。数据库使用事务来确保数据的完整性,现代数据库至少使用两种并发控制方法:锁机制防止两个竞争事务同时访问同一行数据;版本控制则使用多个版本,让每个事务拥有自己的数据副本,若事务间相互干扰,数据库引擎会重新运行该事务。
Java等语言使用锁来保护线程资源,但这将并发控制的负担加在了程序员身上,而Clojure的STM策略使用多版本来维护一致性和完整性。在Clojure中,要改变引用的状态,必须在事务范围内进行。
2. Clojure中的引用与事务内存
在Clojure中, ref (引用的缩写)是封装的数据,所有访问都必须遵循特定规则,以支持STM。不能在事务外更改引用。以下是创建和操作引用的示例:
; 创建引用
user=> (ref "Attack of the Clones")
#<Ref@ffdadcd: "Attack of the Clones">
; 为引用赋值
user=> (def movie (ref "Star Wars"))
#'user/movie
; 获取引用
超级会员免费看
订阅专栏 解锁全文
5

被折叠的 条评论
为什么被折叠?



