相关疑难解决方法(0)

Clojure deftype中的可变字段?

我正在尝试使用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快照.

clojure deftype

21
推荐指数
1
解决办法
6140
查看次数

为什么Java中的变量不是默认的volatile?

可能类似的问题:

你在Java中使用volatile关键字吗?


今天我正在调试我的游戏; 它有一个非常困难的线程问题,每隔几分钟就出现一次,但很难重现.所以首先我将synchronized关键字添加到我的每个方法中.那没用.然后我将volatile关键字添加到每个字段.问题似乎只是解决了问题.

经过一些实验,我发现负责的领域是一个GameState跟踪我的游戏当前状态的对象,可以是正在播放也可以是忙碌.忙时,游戏会忽略用户输入.我所拥有的是一个不断更改state变量的线程,而Event线程读取state变量.但是,在一个线程更改变量后,另一个线程需要几秒钟来识别更改,这最终会导致问题.

它是通过制作状态变量来修复的volatile.

为什么volatile默认情况下不是Java中的变量,以及不使用volatile关键字的原因是什么?

java multithreading volatile

12
推荐指数
5
解决办法
5482
查看次数

有什么语义含义:volatile-mutable与:unynchronized-mutable?

当我注意到一个可变字段用^:unsynchronized-mutable注释时,我正在研究一个clojure lib .Mutable是可变的,但我不知道未同步的部分意味着什么,所以我读了文档,其中包含:

请注意,可变字段非常难以正确使用,并且只是为了便于在Clojure本身中构建更高级别的构造,例如Clojure的引用类型.它们仅供专家使用 - 如果:volatile-mutable或:unynchronized-mutable的语义和含义对您来说不是很明显,那么您就不应该使用它们.

我无法得到细微差别:它是否说在实践中我选择哪个可变性注释无关紧要,或者人们应该忘记完全使用可变类型?

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

谢谢!

clojure mutability

6
推荐指数
1
解决办法
1150
查看次数

标签 统计

clojure ×2

deftype ×1

java ×1

multithreading ×1

mutability ×1

volatile ×1