簡體   English   中英

Common Lisp bordeaux-threads鎖是否等同於Java同步?

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

我來自Java背景,試圖圍繞一些使用with-recursive-lock-held常見Lisp代碼。 現在我在大學學習計算機科學操作系統 - 所以我在理論層面熟悉線程鎖的概念。 我的問題更多是在實際結束。

假設我們有以下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.*更新的 java.util.concurrent.* - 跟我一起來 - 我試圖讓事情變得盡可能簡單)。

(我還假設Common Lisp示例是一個宏,Java示例只是一個圍繞它的同步的數據結構,並且這些不能直接比較。這部分是因為Java語言中的宏是不可能的,但是也因為我認為你是一個聰明的讀者,可以看看這些想法,而不是語法。)

我的問題是: Common Lisp bordeaux-threads鎖是否等同於Java同步?

在以下方面,是的:

  • 他們在線程級別上工作。
  • 它們提供了一個可重入的鎖(你可以選擇在Lisp中不使用遞歸鎖)。

在以下方面,可能:

  • 具體實施方式各不相同。 SBCL使用CAS來獲取互斥鎖,我不知道其他Common Lisp實現是如何實現的。 據我所知,Java沒有。

在以下方面,沒有:

  • 您在Java端為每個SyncronizedExample (原文如此)使用了一個鎖定持有者。 使用類變量會使示例更相似。

在旁邊:

  • 使用&optional (name "printv")為可選參數提供默認值。
  • 我認為不需要你的Lisp表格來包裝progn
  • 使用庫bordeaux-threads (可從Quicklisp獲得)作為低級線程代碼的可移植包裝器。
  • 您可以展示如何調用它們,而不是將Lisp調用包裝到make-mutexwith-recursive-lock中。
  • 您可以展示如何調用Java代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM