我一直在想如何lock
(或更具體的:Monitor
)在.NET內部工作,關於被鎖定的對象。具體來說,我想知道什麼是開銷,是否使用了'全局'(進程)鎖,如果可以創建更多的全局鎖(如果是這種情況)(對於監視器組),以及對象傳遞給鎖(它們似乎不會引入額外的內存開銷)。`lock`(Monitor)如何在.NET中工作?
爲了澄清我沒有問的問題:我在這裏不是問什麼是Monitor(我前一年在大學做過)。我也沒有問如何使用lock
,Monitor,它們是如何編譯爲try/finally等的;我很清楚這一點(還有其他與此相關的SO問題)。這大約是內部工作的Monitor.Enter
和Monitor.Exit
。
例如,考慮十個線程執行該代碼:
for (int i=0; i<1000; ++i)
{
lock (myArray[i])
{
// ...
}
}
- 它是壞的鎖千個對象而不是一個?對性能/內存壓力有什麼影響?
- 底層監視器創建一個等待隊列。是否有可能有多個等待隊列,我將如何創建?
不知道我知道你問什麼。用作「鎖」的對象只是對引用類型的引用。對象內部無關緊要。 'Monitor.Enter'將會看到有關的引用是否在其已經保存的「鎖」的集合上。如果是,它會阻塞線程,直到參考爲空。如果鎖定/變爲空閒,它將被採用(放入該引用集合中),並保存到'Monitor.Exit'中。在你的例子中,如果'myArray'的類型爲'X []'',其中'X'是一個引用類型(即不是結構或枚舉類型),那就沒問題。取決於塊內部的內容。 –
請參閱http://stackoverflow.com/a/1808722/517852 –
另外http://joeduffyblog.com/2007/06/24/clr-monitors-and-sync-blocks/和http://msdn.microsoft。 com/en-us/magazine/cc188793.aspx –