欢迎!有关此页面的更多操作信息,请参阅 关于 页面。
partition-by 和 partition-all 转换器使用存储在 ArrayList 中的状态。为了确保在跨线程进行转换操作时的可见性,状态应该被保护(例如,通过 volatile)。
由 leonoel 发布的评论
在此处讨论: https://groups.google.com/forum/m/#!topic/clojure/VQj0E9TJWYY
请注意,遵循此逻辑,临时变量就像有缺陷一样,因为它们使用纯数组。此段落在 https://clojure.org/reference/transients#_concurrent_use 中让我相信此问题已在前处理过。讨论在哪里可用?在我看来,文档应该更精确地说明什么是线程隔离,并解释当它们 归 属于强制顺序处理的东西(代理、go 块、通道、单线程等)时,为什么可以使用未同步的可变对象。
由 alexmiller 发布的评论
原本,Transients 通过记录和验证源线程来实现线程隔离。在 Clojure 1.7 中为了允许在 go 块中传递 Transients 而削弱了这一机制,并经历了一些修复的回合(如 CLJ-1580)。如果现在存在与此有关的问题,请提交一个单独的工单。