Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure volatile-mutable与unsynchronized-mutable的语义含义是什么?_Clojure_Mutability - Fatal编程技术网

Clojure volatile-mutable与unsynchronized-mutable的语义含义是什么?

Clojure volatile-mutable与unsynchronized-mutable的语义含义是什么?,clojure,mutability,Clojure,Mutability,我正在研究clojure库,这时我注意到一个可变字段被注释为。可变是可变的,但我不知道非同步部分的含义,因此我阅读了,其中包含: 请注意,可变字段非常难以使用 正确,且仅用于促进更高层次的建筑 Clojure中的级别构造,如Clojure的引用类型 它本身它们仅供专家使用-如果语义和含义 of:volatile mutable或:unsynchronized mutable不会立即生效 显然,你不应该使用它们 我无法理解其中的细微差别:是说在实践中,我选择哪种可变注释无关紧要,还是说人们应该完全

我正在研究clojure库,这时我注意到一个可变字段被注释为。可变是可变的,但我不知道非同步部分的含义,因此我阅读了,其中包含:

请注意,可变字段非常难以使用 正确,且仅用于促进更高层次的建筑 Clojure中的级别构造,如Clojure的引用类型 它本身它们仅供专家使用-如果语义和含义 of:volatile mutable或:unsynchronized mutable不会立即生效 显然,你不应该使用它们

我无法理解其中的细微差别:是说在实践中,我选择哪种可变注释无关紧要,还是说人们应该完全忘记使用可变类型

出于好奇,在较低的抽象层次上,它们之间的语义区别是什么


谢谢

这并不是说“人”应该忘记使用可变类型。这意味着任何使用它们的人都应该知道非同步和易失性之间的区别(这意味着这不是Clojure特有的问题,否则会在docstring中解释)。我不知道有哪一个确切的解释,但在使用Clojure的可变deftype字段之前,您应该了解java内存模型以及线程和同步的一般情况


我手边没有一个明确的参考文献,但维基百科似乎对此有一个明确的定义(注意,我刚刚找到了它,只是略读了一下)

这是说,如果您不理解
:volatile mutable
:unsynchronized mutable
之间的区别,您应该使用Clojure的引用类型,而不是直接使用可变字段


这两种可变性有不同的策略来保证共享可变数据的线程之间的一致性,这导致读/写操作的性能不同。有时,您可以通过微调特定种类的可变性来获得更好的性能。如果你天真地使用它们,你可能会发现奇怪的、难以理解的bug。

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

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

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

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

我很抱歉,如果这没有100%的意义;语义复杂;如果您想更深入地了解,请阅读以下内容:

tldr

Volatile的性能略低于非同步的;但它提供了更好的跨线程数据保证


如果可以,请避免使用这两个字段,但是如果需要使用一个,您可能需要
:volatile mutable

这肯定是说您不应该使用可变字段。指向源示例的链接现在已断开,但对于现在想知道警告来源的任何人来说,它位于的文档字符串中。我认为它比“任何使用它们的人都应该知道它们之间的区别。”它确实这么说,但它也说它们的存在只是为了构建更高层次的结构,这在我看来是一种非常强烈的阻碍,在大多数情况下,甚至对于那些确实了解这两种字段类型含义的人来说也是如此。