庄周梦蝶

生活、程序、未来

声明:本博客所有文章,未经允许,禁止转载。谢谢。

Volatile in clojure

| Comments

Java 1.5重新理顺了内存模型,使得volatile关键字的行为更清晰和明确。怎么在Java里使用volatile,可以看看这篇旧文《Java理论与实践:正确使用Volatile》。

在Clojure里又怎么声明一个volatile变量呢?答案是volatile-mutable的metadata。一段Java代码:

public class Person {
  volatile long age;
}

等价的Clojure代码是:

(deftype Person [^:volatile-mutable ^long age])

也可以写成:

(deftype Person [^{:volatile-mutable true :tag long} age])

具体到编译器

boolean isVolatile(LocalBinding lb){
return RT.booleanCast(RT.contains(fields, lb.sym)) &&
           RT.booleanCast(RT.get(lb.sym.meta(), Keyword.intern("volatile-mutable")));
}

如果有volatile-mutable标记,就给access modifier加上AC_VOLATILE。

声明:本博客所有文章,未经允许,禁止转载。谢谢。

Clojure

« Type hint in macro 拥抱 Octopress,再见 WordPress »