【问题标题】:Use locking macro or monitor-enter and monitor-exit in Java from Clojure在 Clojure 的 Java 中使用锁定宏或 monitor-enter 和 monitor-exit
【发布时间】:2023-03-03 19:00:02
【问题描述】:

我有一段 Clojure 代码需要优化以获得更好的性能。我的想法是用java重写它。我在代码中使用了锁定宏的一个对象需要重写,并且该对象也可能被锁定在用 Clojure 代码编写的其他位置。

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

我的问题是,Java 中的什么等于锁定宏,或者 Clojure 引擎盖下的 monitor-entermonitor-exit

【问题讨论】:

    标签: java clojure locking


    【解决方案1】:

    对于以下 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 特殊形式使用相同的字节码指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      相关资源
      最近更新 更多