公共Lisp波尔多线程锁是否等同于Java同步?

公共Lisp波尔多线程锁是否等同于Java同步?,java,multithreading,concurrency,locking,common-lisp,Java,Multithreading,Concurrency,Locking,Common Lisp,我来自Java背景,试图了解一些常用的Lisp代码。现在我在大学里学习计算机科学中的操作系统,所以我在理论上熟悉线程锁的概念。我的问题更多的是从实际出发 假设我们有: 在我看来,这似乎是在操作系统线程级别打开并保持一个锁 如果我尝试用Java来表达这个想法(让我的头脑围绕着它),我会得到如下结果: public class SyncronizedExample { private long protectedLong = 0; private Object sync1 = new

我来自Java背景,试图了解一些常用的Lisp代码。现在我在大学里学习计算机科学中的操作系统,所以我在理论上熟悉线程锁的概念。我的问题更多的是从实际出发

假设我们有:

在我看来,这似乎是在操作系统线程级别打开并保持一个锁

如果我尝试用Java来表达这个想法(让我的头脑围绕着它),我会得到如下结果:

public class SyncronizedExample {
    private long protectedLong = 0;
    private Object sync1 = new Object();

    public void inc1() {
        synchronized(sync1) {
            protectedLong++;
        }
    }
}
(假设我使用的是“老式”Java,而不是from
Java.util.concurrent.*
-请跟我来-我正试图让事情尽可能简单)

(我还假设公共Lisp示例是一个宏,而Java示例只是一个数据结构,周围有一个sync,这些数据结构不能直接比较。这部分是因为Java语言中的宏是不可能的,但也因为我假设您是一个智能阅读器,可以查看想法而不是语法。)


我的问题是:常见的Lisp bordeaux线程锁是否等同于Java同步?

在以下方面,是的:

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

  • 具体实施情况将有所不同。SBCL使用CAS获取互斥体,我不知道其他常见的Lisp实现是如何实现的。据我所知,Java没有
在以下方面,没有:

  • 在Java端,每个SyncronizedExample(原文如此)使用了一个锁夹。改用类变量会使示例更相似
旁白:

  • 使用
    &可选(名称“printv”)
    为可选参数提供默认值
  • 我认为包装
    progn
    不需要Lisp表单
  • 使用库
    波尔多线程
    (可从Quicklisp获得)作为低级线程代码的可移植性包装
  • 您可以展示如何调用它们,而不是在多余的包装器中包装对
    makemutex
    和带有递归锁的
    的Lisp调用
  • 您可以展示如何调用Java代码

对于
sb线程
名称空间中的函数,这些宏看起来像一个非常薄的适配器。有趣的部分是那些sb线程函数的功能。我不知道波尔多线程,所以根据名称,我只能猜测你是对的:它们与Java代码示例所做的相同。“…Java示例只是一个数据结构,周围有一个sync。”
synchronized
是Java语言的一部分。
synchronized(foo){…}
构造是一个语句,就像
if(i)一样
public class SyncronizedExample {
    private long protectedLong = 0;
    private Object sync1 = new Object();

    public void inc1() {
        synchronized(sync1) {
            protectedLong++;
        }
    }
}