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

时间:2016-04-07 19:11:57

标签: java clojure locking

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

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

我的问题是java中的等同于锁定宏,或者来自Clojure的monitor-entermonitor-exit

1 个答案:

答案 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的monitorentermonitorexit字节码指令。 Clojure的monitor-entermonitor-exit特殊表单使用相同的字节码指令。