欢迎!请参阅 关于 页面以了解更多信息如何使用本站。
partition-by 和 partition-all 转换器使用存储在 ArrayList 中的状态。该状态应受到保护(例如,通过 volatile)以确保在用于跨线程计算过程的转换过程中可见。
评论由:leonoel 提出
在此讨论: https://groups.google.com/forum/m/#!topic/clojure/VQj0E9TJWYY
注意,按照这个逻辑,transients 也有同样的问题,因为它们使用原生数组。此段落 https://clojure.org/reference/transients#_concurrent_use 使我相信这个问题之前已经解决。讨论在哪里可以进行?在我看来,文档应该更确切地说明线程隔离的含义,并解释为什么当它们由强制顺序处理的某物(代理、go 块、通道、单线程等)拥有时,可以使用未同步的可变对象。
评论由:alexmiller发布
Transients最初通过记录和验证触发线程来实现线程隔离。在Clojure 1.7中,为了允许在go块之间传递transients而削弱了这一点,并经过了一些修复轮次(例如CLJ-1580)。如果有关于它们的问题,请提交一个单独的工单。