gpt4 book ai didi

clojure - :volatile-mutable versus :unsynchronized-mutable? 的语义含义是什么

转载 作者:行者123 更新时间:2023-12-03 00:21:45 24 4
gpt4 key购买 nike

我正在研究 clojure 库,当时我注意到一个可变字段被注释为 ^:unsynchronized-mutable 。可变是可变的,但我不知道不同步部分意味着什么,所以我读了 docs ,其中包含:

Note well that mutable fields are extremely difficult to use correctly, and are present only to facilitate the building of higher level constructs, such as Clojure's reference types, in Clojure itself. They are for experts only - if the semantics and implications of :volatile-mutable or :unsynchronized-mutable are not immediately apparent to you, you should not be using them.

我无法理解其中的细微差别:这是否意味着在实践中我选择哪种可变性注释并不重要,或者人们应该完全忘记使用可变类型?

并且,出于好奇,在较低的抽象层次上,它们之间的语义差异是什么?

谢谢!

最佳答案

这些是 java 构造,这就是为什么除了“不要使用这个”之外,您不会在 clojure 文档中的任何地方看到它们的引用。

对于所有声明为“ volatile ”的变量,读取和写入都是原子的。

非同步字段是常规的 Java 可变字段。

参见https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

实际上,这意味着如果你有一个数据结构,当多个线程访问该数据时,读或写 volatile 目标将始终保持一致;也就是说,您将始终获得一个完全来自对该数据的操作之前或之后的数据对象。

如果这没有 100% 有意义,我很抱歉;语义复杂;如果您想更深入地了解,请阅读此内容:When exactly do you use the volatile keyword in Java?

tldr;

volatile 的性能比不同步的稍差;但它提供了更好的跨线程数据保证。

如果可以的话请避免两者,但如果您需要使用其中一个,您可能需要 :volatile-mutable

关于clojure - :volatile-mutable versus :unsynchronized-mutable? 的语义含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21127636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com