对于以下 Clojure 代码:
(def someObject ...)
(locking someObject
;; critical section)
其中locking 是一个宏,翻译为:
(let [lock someObject]
(try
(monitor-enter lock)
;; critical section
(finally
(monitor-exit lock))))
Java 的等价物是 synchronized 关键字:
Object someObject = ...;
synchronized (someObject) {
// critical section
}
或在this 参考上同步的另一种形式:
public synchronized void someMethod() {
// critical section
}
相当于:
public void someMethod() {
synchronized (this) {
// critical section
}
}
你也可以在类对象上同步:
public class SomeClass {
public static synchronized void someMethod() {
// critical section
}
}
相当于:
public class SomeClass {
public static void someMethod() {
synchronized (SomeClass.class) {
// critical section
}
}
}
Java 的synchronized 关键字被编译成JVM 的monitorenter 和monitorexit 字节码指令。 Clojure 的 monitor-enter 和 monitor-exit 特殊形式使用相同的字节码指令。