天天看點

C#、OC遞歸鎖

      做ios也有1年了,c#的東西有些都忘記了,最近幾天也打算重溫一下,不能學了ios把c#給抛棄了,兩者都要抓,一精多專。目前c#隻是重溫,重點是web這塊。今天主要是想起了之前做過的面試題,雖然題比較變态,但也有它的意義。

根據線程安全的相關知識,分析以下代碼,當調用test方法時i>10時是否會引起死鎖?并簡要說明理由。

想必做過c#面試過的都會遇到過這題,我記得我第一次面試做的時候也是做錯了,想着遞歸中包含鎖,肯定會死鎖。

       當時回去自己動手敲了一下,然并卵,沒有死鎖。後來又看了大學時的c#教材,又百度了下,發現自己把鎖了解錯了。我記得當時教材上舉的例子是一個銀行取款的例子。而在這道題中,一直都在主線程中,并沒有開啟第二個線程,怎麼會發生鎖呢。 我記得資料庫中也有鎖機制,鎖主要是解決并發的問題,鎖生成的原因主要有兩個:同時争奪同一資源a、b同時要c,争奪資源時形成一個環狀,a要b,b要c,c要a。

在百度搜了下,百度也有這個,解釋如下:在《clr via c#》第二版(中文版,清華大學出版社出版)的第530頁中第7行找到了這樣的描述:“同樣需要引起注意的是線程可以遞歸擁有同步塊”。即同一線程可以遞歸調用lock語句。

---------------華麗分割線-----------------------

剛才試了下oc中的nslock,可是同樣用上面的就會發生死鎖的情況.

百度了下原來還有一個鎖來解決這個的nsrecursivelock

将上面的nslock改為nsrecursivelock,就解決了。具體參考http://www.cocoachina.com/ios/20150513/11808.html

nsrecursivelock可以允許同一線程多次加鎖,而不會造成死鎖。遞歸鎖會跟蹤它被lock的次數。每次成功的lock都必須平衡調用unlock操作。隻有所有達到這種平衡,鎖最後才能被釋放,以供其它線程使用。

繼續閱讀