2012-09-27 137 views
1

我只是想確保我正確理解SyncLock。鑑於下面的代碼是可以安全地說,這些塊都不會同時執行?或者可以肯定地說,在執行任何這些塊期間不會執行其他代碼?我無法理解SyncLock究竟做什麼以及爲什麼需要一個隨機對象來鎖定?兩個同步鎖定的代碼塊是否可以同時執行?

Dim PADLOCK As Object = New Object() 

方框A:

SyncLock PADLOCK 
    '...Code 
End SyncLock 

塊B:

SyncLock PADLOCK 
    '...Code 
End SyncLock 

塊C:

SyncLock PADLOCK 
    '...Code 
End SyncLock 
+0

http://www.albahari.com/threading/part2.aspx#_Locking(以C#編寫的例子,但'lock'關鍵字與Visual Basic中'SyncLock'相同)。 –

回答

4

不完全。首先,鎖是可重入的,所以如果一個方法調用另一個方法(或遞歸地採用相同的方法),則可以使用同一線程中的兩個使用。其次,如果「...代碼」包含Monitor.Wait - 那麼放棄鎖;在這種情況下你可以在方法中有兩個線程,但只有一個線程活動Wait調用阻塞,直到等待的線程可以重新獲取鎖 - 因此,至多有一個線程「擁有」鎖的情況仍然存在。

+0

所以說塊A包含一些迭代通過一些列表並在ThreadA中運行的代碼。然後說ThreadB調用BlockB,它嘗試添加並反對列表會發生什麼? ThreadB是否等待ThreadA解鎖? –

+0

@vanattab是 - 只要A不調用Monitor.Wait,則ThreaadB將被阻止,直到ThreadA到達SyncLock的末尾 –

0

不是。代碼之內的同一個塊不會被不同的線程同時執行。當進程到達SyncLock結束時,CLR釋放該鎖。

爲什麼你需要一個「隨機」對象(如你所說)需要更多的解釋和對CLR對象如何構造,佈局在內存和管理方面有更深入的瞭解。

如果不久,您總是應該在鎖定語句中使用引用類型,並且此對象必須是非公共的以防止死鎖。再一次,在簡短的回答中很難解釋所有這些,我會推薦Jeffrey Richter的書「CLR via .Net」 - 他對這個和其他.Net基礎主題非常深入。