我有一块Clojure代码需要优化才能获得更好的性能。我的想法是用java重写它。有一个对象我在代码中使用了锁定宏,我需要重写它,这个对象也可能被锁定在用Clojure代码编写的地方。
我不想定义新的ReentrantLock对象,因为此应用程序对内存敏感。
我的问题是java中的等同于锁定宏,或者来自Clojure的monitor-enter
和monitor-exit
?
答案 0 :(得分:6)
对于以下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
特殊表单使用相同的字节码指令。