Lock(遞迴函式與死鎖)

2021-05-12 18:37:16 字數 1309 閱讀 5785

看看以下會不會產生死鎖:

public class a

else}}

}class program

}你的答案是會產生死鎖嗎?可以理解,因為也許你以前一直以為外層遞迴被鎖住後,不允許在訪問裡邊的**快,而由於遞迴,有需要等待外層遞迴解鎖,所以由此造成死鎖,現在才知道這種理解是錯誤的;結果是永遠不會出現死鎖,因為lock的本質是對於不同的執行緒來說的,或者這個所的所有權已經歸該現成所有,它可以任意使用該鎖;

說道這裡又想多說一點,假如另乙個執行緒在另乙個函式裡操作同乙個obj,這是obj可以被訪問嗎在鎖釋放之前,如下**:

public class test

public string name

set}

}public class a

}public void twomethod()

}class program

}其輸出結果為:

one thread come in,sleep for 10 seconds

empty

two thread come in//在第乙個執行緒之間操作

two thread output//在第乙個執行緒鎖住test物件之中,改變的test。name屬性值,說明鎖中test時將可以對test進行操作

one thread output

答案是:test物件在別的函式中被鎖中時,別的執行緒在被鎖塊外是可以對test進行操作的

假如我把第二個方法**做如下修改:

public void twomethod()

}這時的結果是:

one thread come in,sleep for 10 seconds

empty

two thread come in//在第乙個執行緒獲得鎖之間執行緒二進入了第二方法中的鎖之前操作

one thread output//

twothread output//說明鎖test被解鎖以後才執行

答案是:乙個類中幾個方法鎖住了同乙個物件(該物件必須是引用型別)時,那麼第乙個獲得鎖的執行緒操作,其他執行緒走到鎖物件(哪怕所物件不是在同乙個函式中)之前將等待物件被解鎖,解鎖後才可以進入。打個比喻:test物件相當於乙個響應器,lock()鎖相當於乙個鎖,作業系統相當於乙個監控器,而乙個或多個函式中的鎖塊相當於乙個或多大門,多個執行緒相當於等在乙個或多個大門前的人。假如有任一乙個大門被乙個人闖進時,那麼監控器立即給所有鎖上鎖lock,鎖定所有大門,不准任何人進,直到該人出來,監控器自動開啟所有鎖,所有大門開啟,重複執行第一步,監控器保證只有乙個人進入某乙個大門。當然如果某乙個響應器沒有lock,就相當於大門沒有鎖,就可以對test操作,這種情況就是上一種現象

Lock死鎖的案例

死鎖 執行緒a和執行緒b相互等待對方持有的鎖導致程式無限死迴圈下去 1 兩個執行緒裡面分別持有兩個object物件 lock1和lock2。這兩個lock作為同步 塊的鎖 2 執行緒1的run 方法中同步 塊先獲取lock1的物件鎖,thread.sleep 然後接著獲取lock2的物件鎖。這麼做主...

死鎖問題和解決方法 lock 函式

死鎖,兩個鎖 兩個互斥量 被兩個執行緒按亂序使用導致死鎖,跟解鎖順序無關 死鎖的解決辦法一 保證兩個互斥量上鎖的順序一致就不會死鎖。解決方法二 std lock 函式,一次鎖住兩個或兩個以上的互斥量 至少兩個,多了不限,1個不行 要麼兩個互斥量都鎖住,要麼兩個互斥量都沒鎖住。如果只鎖了乙個,另外乙個...

C 中lock死鎖例項教程

這篇文章主要介紹了c 中lock死鎖的用法,對於共享資源的訪問及c 程式設計的安全性而言,有著非常重要的意義!需要的朋友可以參考下 lock的使用原型是 1 234lock x 首先要明白為什麼上面這段話能夠鎖定 其中的奧妙就是x這個物件,事實上x是任意一種引用型別,它在這兒起的作用就是任何執行緒執...