2016-04-07 20 views
2

Daha iyi performans için optimize edilmesi gereken bir Clojure kodu parçam var. Benim düşüncem onu ​​java kullanarak yeniden yazmak. Yeniden yazmam gereken kodda kilitleme makrosu kullandım tek bir nesne var ve bu nesne aynı zamanda nerede Clojure kodunda yazılmışsa kilitlenebilir.Java'da kilitleme makrosu ya da monitör giriş ve çıkış-çıkışını kullanın Clojure

Bu uygulama bellek duyarlı olduğundan yeni ReentrantLock nesnesini tanımlamak istemiyorum.

Soruma, java'nın kilitleme makrosuna veya monitor-enter ve monitor-exit Clojure kapağının altına eşit olduğu sorusu nedir? locking bir makro çeviri olduğunu

(def someObject ...) 

(locking someObject 
    ;; critical section) 

: Aşağıdaki Clojure kodu için

cevap

5

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

Java'nın eşdeğer synchronized kelime olup:

Object someObject = ...; 
synchronized (someObject) { 
    // critical section 
} 

Veya başka formu üzerinde senkronize this referans: 01

public void someMethod() { 
    synchronized (this) { 
     // critical section 
    } 
} 

Ayrıca sınıf nesne üzerinde senkronize edebilirsiniz:

public synchronized void someMethod() { 
    // critical section 
} 
eşdeğerdir

public class SomeClass { 
    public static void someMethod() { 
     synchronized (SomeClass.class) { 
      // critical section 
     } 
    } 
} 

Java'nın synchronized anahtar kelimedir:

public class SomeClass { 
    public static synchronized void someMethod() { 
     // critical section 
    } 
} 

eşdeğerdir hangi com JVM'nin monitorenter ve monitorexit bytecode komutlarına yönlendirilmiştir. Clojure'ın monitor-enter ve monitor-exit özel formları, aynı bayt kodu yönergelerini kullanır.

İlgili konular