2013-05-09 59 views

回答

1

沒關係,任何對象都足以充當存儲鎖定狀態的地方。

但是,在任何代碼審查中,這是一個強烈的紅旗,暗示程序員正在考慮鎖定錯誤的方式。在.NET中沒有「鎖定對象以使其線程安全」這樣的事情。這個概念確實存在,這是許多學術研究的主題,稱爲STM或軟件事務內存。但是在.NET框架中沒有一點支持。

您使用鎖來塊代碼。危險的代碼可以由多個線程執行並讀取或寫入變量。通常在多個地方存在特定位置的源代碼文件中的代碼。您使用鎖定來確保只有一個線程可以同時在這些特定位置執行代碼。鎖狀態因此與代碼的部分相關聯,而不是對象。因此,應該需要一個專用對象來存儲這些特定部分的鎖定狀態。你通過擁有這樣一個專門的對象來表明你知道自己在做什麼,而不是僅僅選擇一個你正在做的事情。還強烈自我記錄,使得查看鎖定發生的位置變得更加容易,因爲您只需搜索鎖定變量的名稱即可。

+0

謝謝。我知道這一點,但在編寫代碼時會忘記它。 – Monstieur 2013-05-09 09:41:39

+0

這並不意味着很多。一般來說,當你想要一個鎖時,並不是因爲你只需要一個線程運行該代碼塊,而是你不希望任何地方的任何代碼都可以通過多個線程訪問某個對象。 – 2014-06-20 22:40:39

+0

「我可以鎖定一個對象,但沒有其他人可以達到它」的另一個受害者。 – 2014-06-20 22:48:03

0

對於想要同步訪問的對象,您可以確保所有鎖定在其上的代碼都在您的控制之下(因爲否則,理論上可能會出現代碼,不知道鎖定在同一個對象上並導致死鎖)。

大多數時候,你看到的專用鎖對象正是因爲這樣的時間:如果你想修改暴露(例如,通過一個屬性)的集合好習慣決定了你不能對集合本身鎖定。

在這種情況下,鎖定目標是private,所以如果你沒有明確地向外界公開它,你很好。