欢迎!请查看关于页面以获取更多关于此工作方式的信息。
partition-by 和 partition-all 转换器使用存储在 ArrayList 中的状态。此状态应该被保护(例如,使用 volatile)以确保在跨线程转换计算过程中使用时的可见性。
评论者:leonoel
此处讨论:https://groups.google.com/forum/m/#!topic/clojure/VQj0E9TJWYY
注意,按照这个逻辑,transients 一样有问题,因为它们使用的是普通的数组。此段https://clojure.org/reference/transients#_concurrent_use让我相信,这个问题已经被解决过。讨论在哪里可以进行?在我看来,文档应该更精确地说明线程隔离的含义,并解释当这些对象由强制顺序处理的东西(agents,go 块,channel,单线程等)所拥有时为什么可以安全地使用未同步的可变对象。
评论人:alexmiller
原始的 Transients 通过记录和验证发起线程来强制执行线程隔离。这在 Clojure 1.7 中被削弱,以便允许在 go 块中传递 Transients,并经历了几轮修复(如 CLJ-1580)。如果现在存在问题,请提交一个单独的工单。