2016-04-07 10 views
2

Ich habe ein Stück Clojure-Code für eine bessere Leistung optimieren müssen. Mein Gedanke ist, es mit Java neu zu schreiben. Es gibt ein Objekt, das ich Makro in dem Code verwendet, den ich neu schreiben muss, und dieses Objekt kann auch sonst wo gesperrt werden, die in Clojure-Code geschrieben wird.Verwenden Sie Sperrmakro oder Monitor-Enter und Monitor-Exit in Java von Clojure

Ich möchte kein neues ReentrantLock-Objekt definieren, da diese Anwendung speichersensitiv ist.

Meine Frage ist, was in Java ist gleich Sperren Makro oder monitor-enter und monitor-exit unter der Haube von Clojure?

Antwort

5

Für den folgenden Clojure Code:

(def someObject ...) 

(locking someObject 
    ;; critical section) 

wo locking ein Makro übersetzen ist:

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

Java-äquivalent synchronized Stichwort:

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

Oder eine andere Form Synchronisation auf this Referenz:

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

dem entspricht:

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

Sie können auch auf Klassenobjekt synchronisieren:

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

das ist äquivalent zu:

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

synchronized Stichwort Java ist com gestapelt in JVM monitorenter und monitorexit Bytecode-Anweisungen. Clojures monitor-enter und monitor-exit spezielle Formulare verwenden die gleichen Bytecode-Anweisungen.

Verwandte Themen