使用来自Clojure的Java中的锁定宏或monitor-enter和monitor-exit

Shi*_*oft 4 java locking clojure

我有一块Clojure代码需要优化才能获得更好的性能.我的想法是用java重写它.有一个对象我在代码中使用了锁定宏,我需要重写,这个对象也可能被锁定在Clojure代码中的其他地方.

我不想定义新的ReentrantLock对象,因为此应用程序对内存敏感.

我的问题是什么在Java等于锁定宏,或monitor-entermonitor-exit受到来自Clojure的引擎盖?

Pio*_*dyl 6

对于以下Clojure代码:

(def someObject ...)

(locking someObject
  ;; critical section)
Run Code Online (Sandbox Code Playgroud)

locking宏在哪里翻译为:

(let [lock someObject]
  (try
    (monitor-enter lock)
    ;; critical section
    (finally
      (monitor-exit lock))))
Run Code Online (Sandbox Code Playgroud)

Java的等价物是synchronized关键字:

Object someObject = ...;
synchronized (someObject) {
    // critical section
}
Run Code Online (Sandbox Code Playgroud)

或者另一种形式同步this参考:

public synchronized void someMethod() {
    // critical section
}
Run Code Online (Sandbox Code Playgroud)

这相当于:

public void someMethod() {
    synchronized (this) {
        // critical section
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以在类对象上进行同步:

public class SomeClass {
    public static synchronized void someMethod() {
        // critical section
    }
}
Run Code Online (Sandbox Code Playgroud)

这相当于:

public class SomeClass {
    public static void someMethod() {
        synchronized (SomeClass.class) {
            // critical section
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Java的synchronized关键字被编译成JVM monitorentermonitorexit字节码指令.Clojure monitor-entermonitor-exit特殊表单使用相同的字节码指令.