2009-12-09 37 views
16

可能重複:
Difference between lock(locker) and lock(variable_which_I_am_using)爲什麼在獨立的對象上執行鎖定?

在所有的「線程安全」的代碼示例我已經看到了,他們鎖在一個單獨的虛擬對象。爲什麼不能直接對有問題的數據執行鎖定?

+0

很好的問題,這也是我的第一個想法。 – Russell 2009-12-09 11:54:59

+1

爲了幫助人們找到最佳答案,他們正在尋找這個問題不應該被關閉。 @Bill,所謂的確切的重複問題,題目不明確,並沒有明確說明與這個問題不同的基本問題。我相信這個問題更有可能在搜索中引起注意。因此我已經投票重新開放。 – Ash 2009-12-12 05:45:06

回答

18

鎖定單獨的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); 
     } 
    } 
} 
+0

問題的好例子。 – RichardOD 2009-12-09 11:22:41

+0

我想我明白了。如果你有一個單獨的虛擬對象,那麼通過鎖定你想使用的對象,你不會阻止它做任何事情? – RCIX 2009-12-10 02:12:23

+0

我的意思是,當您嘗試調用某個需要計時的對象的方法時。 – RCIX 2009-12-10 02:13:20

2

在Eric Gunnerson的博客上有一些很棒的內容。請參閱herehere

8

Jeff Richter(CLR Via C#的作者)解釋了爲什麼要在Safe Thread Synchronization這篇文章中。

具體來說,在那篇文章中,「爲什麼偉大的想法不是很好」一節回答你的問題。

它實際上是書CLR Via C#中的一章。

總之,將私有對象作爲「synclock」對象允許您的類封裝並控制您的類需要的任何鎖定。因此,無論有多少客戶使用您的課程,鎖定始終如一地執行正確。

+0

+1。我要指出他的書,但這篇文章實際上是一樣的! – RichardOD 2009-12-09 11:22:00

+0

如果在某些操作過程中需要鎖定某個對象,並且如果外部代碼可能需要執行兩個或多個操作,而不在它們之間釋放鎖,則該對象必須公開該鎖或方法以獲取並釋放它。暴露都不會使外部代碼無法正確地做它需要做的事情。 – supercat 2014-05-06 18:06:59

相關問題