Common Lisp bordeaux-threads 锁是否等同于 Java 同步?

Is a Common Lisp bordeaux-threads lock equivalent to Java synchronization?

我来自 Java 背景,试图围绕一些使用 with-recursive-lock-held 的常见 Lisp 代码。现在我在大学学习计算机科学操作系统 - 所以我在理论层面熟悉线程锁的概念。我的问题更实际。

假设我们有 following Common Lisp code:

(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.util.concurrent.* 中的 'old-school' Java synchronization, and not the newer Locks - 跟我一起来 - 我试图让事情保持原样尽可能简单)。

(我还假设 Common Lisp 示例是一个宏,而 Java 示例只是一个带有同步的数据结构,并且它们不能直接比较。这部分是因为宏在 Java 语言中是不可能的,还因为我假设你是一个聪明人 reader,并且可以查看想法而不是语法。)

我的问题是:Common Lisp bordeaux-threads 锁等同于Java同步吗?

在以下几个方面,是的:

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

可能在以下几个方面:

  • 实施的细节会有所不同。 SBCL 使用 CAS 来获取互斥锁,我不知道其他 Common Lisp 实现是如何做到的。 Java 据我所知没有。

在以下几个方面,没有:

  • 您在 Java 侧每个 SyncronizedExample(原文如此)使用了一个锁架。使用 class 变量会使示例更相似。

旁白:

  • 使用&optional (name "printv")为可选参数赋予默认值。
  • 我认为包装不需要您的 Lisp 表单 progn
  • 使用库 bordeaux-threads(可从 Quicklisp 获得)作为低级线程代码的可移植包装器。
  • 您可以展示如何调用它们,而不是将对 make-mutexwith-recursive-lock 的 Lisp 调用包装在多余的包装器中。
  • 您可以展示如何调用 Java 代码。