2011-08-31 29 views
4

比方說,我有一個看起來像這樣的一個成員的類:如何使儲物櫃對象靜態影響其行爲?

readonly object _locker; 

,我使用這樣同步的代碼塊:

lock (_locker) 
{ 
    // Do something 

    Monitor.Pulse(_locker); 
} 

這:

lock (_locker) 
{ 
    while (someCondition) 
     Monitor.Wait(_locker); 

    // Do something else 
} 

假設我有多個這個特定類的實例,它們都在同一時間運行,使用單獨的線程。

如果我讓鎖櫃對象static會發生什麼情況,鎖的行爲和Monitor.WaitMonitor.Pulse調用?

static readonly object _locker; 

難道他們都突然開始步調一致地工作(例如鎖定的代碼塊需要在物體的所有實例lock),或有行爲沒有變化?

回答

5

通過使_locker靜態,您可以創建1個共享關鍵區域。是的,他們都會等待對方。當共享數據也是靜態的時候,這是明智和必要的。

如果共享數據是每個實例,則不要使_locker爲靜態。

換句話說,它取決於// Do something else的真實代碼是什麼。

+0

我見過的大部分代碼示例都使用'static'關鍵字,所以我猜這種類型的投擲我。 –

+0

這兩種形式都被使用,它完全取決於數據。 –

2

該對象將在所有實例之間共享,因此如果每個對象嘗試獲取該鎖並且其他對象具有該對象,則該對象將被阻塞。