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-mutex
和 with-recursive-lock
的 Lisp 调用包装在多余的包装器中。
- 您可以展示如何调用 Java 代码。
我来自 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-mutex
和with-recursive-lock
的 Lisp 调用包装在多余的包装器中。 - 您可以展示如何调用 Java 代码。