2016-04-07 7 views
2

パフォーマンス向上のためにClojureコードを最適化する必要があります。私の考えはjavaを使って書き直すことです。 1つのオブジェクトがありますが、私は書き直す必要があるコードにロッキングマクロを使用していますが、このオブジェクトはClojureコードで記述されている場所にロックされている可能性もあります。ClojureからJavaのロックマクロまたはmonitor-enterとmonitor-exitを使用してください。

このアプリケーションはメモリに敏感なので、私は新しいReentrantLockオブジェクトを定義したくありません。

私の質問は、Javaでロックマクロと同じか、またはmonitor-entermonitor-exitで、Clojureのフードの下にありますか?次のClojureコードの場合

答えて

5

(def someObject ...) 

(locking someObject 
    ;; critical section) 
lockingマクロ翻訳され

へ:

(let [lock someObject] 
    (try 
    (monitor-enter lock) 
    ;; critical section 
    (finally 
     (monitor-exit lock)))) 

Javaの同等は​​キーワードです:

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の​​キーワードでありますcom JVMのmonitorentermonitorexitバイトコード命令に積み重ねられています。 Clojureのmonitor-entermonitor-exit特殊形式は、同じバイトコード命令を使用します。

関連する問題