2012-06-01 27 views
0

我看到使用靜態只讀對象的鎖定很多,這個語句在下面給出的代碼中的意義是什麼?我知道鎖定應用於一個對象,這只是一個鎖定對象工作,這只是一個黑客攻擊,因爲我不需要任何對象,只是創建一個對象,以便鎖定工作?關於C#線程鎖定的一個小查詢

此外,而不是隻是說對象obj1 =新的對象()我使用只讀和靜態,我想由於增加的性能,但只讀和靜態如何幫助提高性能?

static readonly object locker = new object(); 

代碼如下:

class ThreadSafe 
{ 
    static bool done; 
    static readonly object locker = new object(); 

    static void Main() 
    { 
    new Thread (Go).Start(); 
    Go(); 
    } 

    static void Go() 
    { 
    lock (locker) 
    { 
     if (!done) { Console.WriteLine ("Done"); done = true; } 
    } 
    } 
} 
+0

[爲什麼鎖對象必須是靜態的](http://stackoverflow.com/questions/5053172/why-does-the-lock-object-has-to-be-static) –

回答

0

有一個對象,其唯一目的是提供一個鎖簡化了一些事情。爲了防止外部代碼弄亂你的鎖並導致你所有的悲傷,你真的很想要一個只能看到你的鎖。最簡單的方法就是創建一個對象。 (如果你有另一個對象,沒有其他人可以訪問,你可以使用這個...但鎖與其他東西分開往往會保持概念上的東西更簡單。)

至於爲什麼它是靜態的..這與其說是一個正確的表現並不太重要。爲了鎖定靜態方法或同步對靜態資源的訪問,您需要一個屬於該類的對象,而不是一個實例。否則,每個實例都會鎖定自己的鎖,而不是共享一個 - 除非僅存在一個實例,並且即使那樣也是不正確的,否則這將是無用的。對於非靜態方法,除非由於某種原因您正在訪問靜態屬性或類似的東西,否則不會使用static。如果您確實使用了它,並且不需要同步實例之間的訪問權限,那麼最終會導致不必要的鎖定並放慢速度。

3

這是一個recommended practice使用單獨的專用對象鎖定,而不是已經存在的全局可見的對象,因爲有其他代碼的鎖定決策風險較低干擾與您的私人鎖定方案(這種問題是非常難以證明和診斷;所以最好是使他們不可能)。

該locker對象需要是靜態的,如果它服務於靜態類,或者您的意圖是應用程序範圍的鎖定;並且如果它僅用於鎖定單個對象實例,則它需要是實例對象,允許同時處理同一服務的類或類層次結構中的其他對象。

顯式讀取在這種情況下不會對性能產生直接影響,但在大多數情況下(主要是通過防止重新加載)會影響性能,因此標記所有隻讀對象是一種有用的習慣。