请在2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多关于此工作方式的信息。

0
转换器

partition-by 和 partition-all 转换器使用存储在 ArrayList 中的状态。此状态应该被保护(例如,使用 volatile)以确保在跨线程转换计算过程中使用时的可见性。

4 答案

0
0

评论者:leonoel

注意,按照这个逻辑,transients 一样有问题,因为它们使用的是普通的数组。
此段https://clojure.org/reference/transients#_concurrent_use让我相信,这个问题已经被解决过。讨论在哪里可以进行?
在我看来,文档应该更精确地说明线程隔离的含义,并解释当这些对象由强制顺序处理的东西(agents,go 块,channel,单线程等)所拥有时为什么可以安全地使用未同步的可变对象。

0
by

评论人:alexmiller

原始的 Transients 通过记录和验证发起线程来强制执行线程隔离。这在 Clojure 1.7 中被削弱,以便允许在 go 块中传递 Transients,并经历了几轮修复(如 CLJ-1580)。如果现在存在问题,请提交一个单独的工单。

0
by
参考:https://clojure.atlassian.net/browse/CLJ-2146(由 alexmiller 报告)
...