Common Lisp波尔多线程锁是否等效于Java同步?

鹰眼

我来自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同步?

斯万特

在以下方面,是:

  • 它们在线程级别上工作。
  • 它们提供了可重入锁(不过,您可以选择不在Lisp中使用递归锁)。

在以下方面,也许:

  • 具体实施方式将有所不同。SBCL使用CAS来获取互斥体,我不知道其他Common Lisp实现是如何实现的。据我所知,Java没有。

在以下方面,否:

  • SyncronizedExample在Java端每个(原文如此)使用了一个锁持有人相反,使用类变量会使示例更相似。

在旁边:

  • 用于&optional (name "printv")为可选参数提供默认值。
  • 我认为您不需要Lisp表格进行包装progn
  • 使用该库bordeaux-threads(可从Quicklisp获得)作为低级线程代码的可移植包装。
  • 相反包裹Lisp的调用的make-mutex,并with-recursive-lock在包装多余的,你可以告诉你如何给他们打电话。
  • 您可以展示如何调用Java代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章