我来自Java背景,试图将我的头包裹在使用的通用Lisp代码周围with-recursive-lock-held
。现在,我在大学学习了计算机科学的操作系统-因此,我在理论层面上熟悉线程锁的概念。我的问题更多是在实际操作中。
假设我们有以下Common Lisp代码:
(progn
(defun make-recursive-lock (&optional name)
(sb-thread:make-mutex :name (or name "printv")))
(defmacro with-recursive-lock-held ((place) &body body)
`(sb-thread:with-recursive-lock (,place)
,@body)))
对我来说,这似乎是在操作系统线程级别打开并按住一个锁。
如果我尝试用Java表达这个想法(将我的想法缠住)-我会得到类似:
public class SyncronizedExample {
private long protectedLong = 0;
private Object sync1 = new Object();
public void inc1() {
synchronized(sync1) {
protectedLong++;
}
}
}
(有我使用“老派”的Java假设同步,而不是新的 锁从java.util.concurrent.*
-跟我来这个-我试图让事情尽可能的简单)。
(我还假设Common Lisp示例是一个宏,而Java示例只是一个带有同步的数据结构,并且它们不能直接比较。这部分是因为Java语言中的宏是不可能的,但是也因为我假设您是个聪明的读者,并且可以研究这些主意,而不是语法。)
我的问题是:Common Lisp波尔多线程锁是否等效于Java同步?
在以下方面,是:
在以下方面,也许:
在以下方面,否:
SyncronizedExample
在Java端每个(原文如此)使用了一个锁持有人。相反,使用类变量会使示例更相似。在旁边:
&optional (name "printv")
为可选参数提供默认值。progn
。bordeaux-threads
(可从Quicklisp获得)作为低级线程代码的可移植包装。make-mutex
,并with-recursive-lock
在包装多余的,你可以告诉你如何给他们打电话。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句