我正在尝试使用Clojure 1.2,特别是deftype根据clojure.org文档支持的可变字段.
但是我不能让这套装置工作.更新字段的语法是什么?或者是否实现了可变性?
(definterface IPoint
(getX [])
(setX [v]))
(deftype Point [x]
IPoint
(getX [this] x)
(setX [this v] (set! (.x this) v)))
user=> (def p (Point. 10))
user=> (.getX p)
10
user=> (.setX p 20)
ClassCastException: user.Point cannot be cast to compile__stub.user.Point
Run Code Online (Sandbox Code Playgroud)
使用几天前的1.2快照.
可能类似的问题:
synchronized关键字添加到我的每个方法中.那没用.然后我将volatile关键字添加到每个字段.问题似乎只是解决了问题.
经过一些实验,我发现负责的领域是一个GameState跟踪我的游戏当前状态的对象,可以是正在播放也可以是忙碌.忙时,游戏会忽略用户输入.我所拥有的是一个不断更改state变量的线程,而Event线程读取state变量.但是,在一个线程更改变量后,另一个线程需要几秒钟来识别更改,这最终会导致问题.
它是通过制作状态变量来修复的volatile.
为什么volatile默认情况下不是Java中的变量,以及不使用volatile关键字的原因是什么?
当我注意到一个可变字段用^:unsynchronized-mutable注释时,我正在研究一个clojure lib .Mutable是可变的,但我不知道未同步的部分意味着什么,所以我读了文档,其中包含:
请注意,可变字段非常难以正确使用,并且只是为了便于在Clojure本身中构建更高级别的构造,例如Clojure的引用类型.它们仅供专家使用 - 如果:volatile-mutable或:unynchronized-mutable的语义和含义对您来说不是很明显,那么您就不应该使用它们.
我无法得到细微差别:它是否说在实践中我选择哪个可变性注释无关紧要,或者人们应该忘记完全使用可变类型?
并且,为了好奇,在较低的抽象层次中,它们之间的语义差异是什么?
谢谢!