Shi*_*oft 4 java locking clojure
我有一块Clojure代码需要优化才能获得更好的性能.我的想法是用java重写它.有一个对象我在代码中使用了锁定宏,我需要重写,这个对象也可能被锁定在Clojure代码中的其他地方.
我不想定义新的ReentrantLock对象,因为此应用程序对内存敏感.
我的问题是什么在Java等于锁定宏,或monitor-enter与monitor-exit受到来自Clojure的引擎盖?
对于以下Clojure代码:
(def someObject ...)
(locking someObject
;; critical section)
Run Code Online (Sandbox Code Playgroud)
locking宏在哪里翻译为:
(let [lock someObject]
(try
(monitor-enter lock)
;; critical section
(finally
(monitor-exit lock))))
Run Code Online (Sandbox Code Playgroud)
Java的等价物是synchronized关键字:
Object someObject = ...;
synchronized (someObject) {
// critical section
}
Run Code Online (Sandbox Code Playgroud)
或者另一种形式同步this参考:
public synchronized void someMethod() {
// critical section
}
Run Code Online (Sandbox Code Playgroud)
这相当于:
public void someMethod() {
synchronized (this) {
// critical section
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以在类对象上进行同步:
public class SomeClass {
public static synchronized void someMethod() {
// critical section
}
}
Run Code Online (Sandbox Code Playgroud)
这相当于:
public class SomeClass {
public static void someMethod() {
synchronized (SomeClass.class) {
// critical section
}
}
}
Run Code Online (Sandbox Code Playgroud)
Java的synchronized关键字被编译成JVM monitorenter和monitorexit字节码指令.Clojure monitor-enter和monitor-exit特殊表单使用相同的字节码指令.
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |