可能重複:
Difference between lock(locker) and lock(variable_which_I_am_using)爲什麼在獨立的對象上執行鎖定?
在所有的「線程安全」的代碼示例我已經看到了,他們鎖在一個單獨的虛擬對象。爲什麼不能直接對有問題的數據執行鎖定?
可能重複:
Difference between lock(locker) and lock(variable_which_I_am_using)爲什麼在獨立的對象上執行鎖定?
在所有的「線程安全」的代碼示例我已經看到了,他們鎖在一個單獨的虛擬對象。爲什麼不能直接對有問題的數據執行鎖定?
鎖定單獨的private
虛擬對象可以保證沒有其他人鎖定該對象。
如果您鎖定了數據並且同一條數據對外部可見,則會失去該保證。例如:
public class MyObject
{
public void SharedMethod()
{
lock (this)
{
// Do stuff
}
}
}
class Program
{
static void Main(string[] args)
{
MyObject o = new MyObject();
lock (o)
{
new Thread(() =>
{
// Gets blocked 2s because of external lock
o.SharedMethod();
}).Start();
Thread.Sleep(2000);
}
}
}
Jeff Richter(CLR Via C#的作者)解釋了爲什麼要在Safe Thread Synchronization這篇文章中。
具體來說,在那篇文章中,「爲什麼偉大的想法不是很好」一節回答你的問題。
它實際上是書CLR Via C#中的一章。
總之,將私有對象作爲「synclock」對象允許您的類封裝並控制您的類需要的任何鎖定。因此,無論有多少客戶使用您的課程,鎖定始終如一地執行正確。
很好的問題,這也是我的第一個想法。 – Russell 2009-12-09 11:54:59
爲了幫助人們找到最佳答案,他們正在尋找這個問題不應該被關閉。 @Bill,所謂的確切的重複問題,題目不明確,並沒有明確說明與這個問題不同的基本問題。我相信這個問題更有可能在搜索中引起注意。因此我已經投票重新開放。 – Ash 2009-12-12 05:45:06