本节书摘来自华章社区《clojure数据分析秘笈》一书中的第3章,第3.4节使用commute获得更好的性能,作者(美)eric rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看
3.4 使用commute获得更好的性能
3.2节中创建的stm系统有一个小问题:试图引用并更新total-hu和 total-fams的进程会不必要地竞争这两个全局变量。由于为了等待访问这两个资源,进程里任务都中断了,许多任务都需要重试。
但是其实没必要如此。进程仅使用可交换函数(#(+ sum-? %))来更新这些值。这些更新执行的顺序无关紧要。而且由于处理过程完成之前处于阻塞状态,不必担心两个引用会不同步。它们在访问其值之前会最终回到同一状态,这对于这种应用场景来说非常好。
为了处理这种情况(使用可交换函数计算引用值),应该使用commute替换alter。alter函数当场更新引用值;commute将更新操作加入队列中待引用未被占用时再执行。这避免了引用的竞争问题并可以加速系统运行。