本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第3章,第3.2节使用STM管理程序复杂度,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看
3.2 使用STM管理程序复杂度
Clojure并发特性的基础是它的STM系统。这基本上是将数据库事务的语义扩展至计算机内存中。
STM工作方式是使用ref函数标记由STM控制的内存位置。可以使用deref函数或者@宏在任意位置对那些内存位置进行反引用。但是仅能修改在dosync块内部引用的值。接着,当事务执行完毕后,STM执行检查。如果事务改变的引用被另一个事务修改,事务失败,并排队进行重试。然而,如果没有引用改变,事务成功并提交。
当在事务中时,如果在外部编程,这些值不会改变。一旦事务提交,使用ref-set或者alter对那些位置所做的修改将在程序块外可见。
警告:使用STM应该仅使用Clojure本地的不可变的数据类型。这听起来限制较大,但在实践中,它并不是个大问题:Clojure有一个丰富又灵活的数据类型集合。而且,我们应该限制在每个事务中所做的工作量。我们仅想将那些真正必须成功或失败的操作绑定在一起作为一个集合。
STM帮助管理复杂度,通过允许将整个处理过程按一种对最有意义的方式分解,然后并发执行这些过程。STM和不可变状态一起使得系统简单而又易理解。