公共Lisp波尔多线程锁是否等同于Java同步?
我来自Java背景,试图了解一些常用的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
public class SyncronizedExample {
private long protectedLong = 0;
private Object sync1 = new Object();
public void inc1() {
synchronized(sync1) {
protectedLong++;
}
}
}
(假设我使用的是“老式”Java,而不是fromJava.util.concurrent.*
-请跟我来-我正试图让事情尽可能简单)
(我还假设公共Lisp示例是一个宏,而Java示例只是一个数据结构,周围有一个sync,这些数据结构不能直接比较。这部分是因为Java语言中的宏是不可能的,但也因为我假设您是一个智能阅读器,可以查看想法而不是语法。)
我的问题是:常见的Lisp bordeaux线程锁是否等同于Java同步?在以下方面,是的:
- 它们在线程级别上工作
- 它们提供了一个可重入锁(不过,您可以选择在Lisp中不使用递归锁)
- 具体实施情况将有所不同。SBCL使用CAS获取互斥体,我不知道其他常见的Lisp实现是如何实现的。据我所知,Java没有
- 在Java端,每个SyncronizedExample(原文如此)使用了一个锁夹。改用类变量会使示例更相似
- 使用
为可选参数提供默认值&可选(名称“printv”)
- 我认为包装
不需要Lisp表单progn
- 使用库
(可从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++;
}
}
}