2014-06-23 78 views
1

嗨根據http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx 一個可以聲明的對象鎖定的目的:C#鎖定私有靜態對象

private Object thisLock = new Object(); 

但是,當我需要從一個靜態方法鎖定它,我需要將其聲明爲靜態:

private static Object thisLock = new Object(); 

然後MOR e從MSDN頁面,

鎖(「myLock」)是一個問題,因爲在使用相同字符串的進程中的任何其他代碼將共享相同的鎖。

所以,如果它是一個靜態的對象,而不是字符串,它會在同樣的方法被調用多次的問題,他們每個人試圖鎖定thisLock,因爲它是相同的靜態對象,因此他們實際上是分享鎖定?

謝謝你的時間。

+0

是的,他們都會鎖定對象的同一個實例。那是問題嗎?這似乎是你的意圖。與靜態,當然,每個實例使用相同的鎖(而不是不同的),但預計與靜態...我錯過了你的問題? – BradleyDotNET

回答

4

所以,如果它是一個靜態的對象,而不是字符串,就會有問題,當同樣的方法被調用多次

不完全是。字符串是特殊的,它們可以被實施。您不能像其他對象那樣控制其可見性。

的基本準則:

  • 讓您lockObject與保護資源的緊密1對1的關係。數量,範圍和壽命。所以使用一個靜態的lockObject來保護靜態數據。
  • 保持lockObject儘可能私有,暴露它增加了死鎖的風險。出於這個原因,也避免鎖定類型和字符串。

,因爲它是相同的靜態對象,因此他們實際上是共享的鎖?

訪問共享資源具有共享(鎖定)相同lockObject實例中的所有的代碼。私人鎖不起作用。

+0

如果我有一種方法會以並行方式多次調用,並且此方法將鎖定lockObject,是否存在線程安全問題?如果是的話,我能做些什麼來確保線程安全?謝謝。 – Cal

+0

查看第2部分。___ –