2011-10-06 18 views
2

所以在閱讀this後,我對「鎖定」機制有些困惑,或者只是對請求產生了根本性的困惑。獲取對靜態對象的鎖應該阻塞其他請求線程?

給定類的靜態變量是否可以被所有請求訪問(假設一個服務器)?據我所知,他們不是。

並且假設靜態/常量變量不能被多個請求訪問,當我們鎖定(someLockObject)時,它不應該阻塞其他請求,因爲「鎖定」獲得與該對象相關的排它鎖。再次,該對象(即someLockObject)對於我所假設的所有請求都是不同的。

This回答,以及其他一些問題,意味着我對某事有錯。如果「鎖定」僅阻止關鍵部分,意味着所有在「鎖定」代碼塊中執行同一段代碼的線程,那麼爲什麼我們必須阻止對象呢?我自己可能沒有太大的意義。

回答

4

你的困惑源於原來的假設:

是給定類的靜態變量訪問所有的請求(假設一臺服務器)?據我所知,他們不是。

對於整個應用程序域中每個線程中的每個實例,特定類的靜態字段都是相同的。出於實際的目的,在一個服務器實例中,基本上意味着在所有請求之間共享一個static字段。

常數值更加全局:參考const值實際上會在編譯代碼中產生一個文字常量。例如:

Console.WriteLine(3); 

...產生完全相同的代碼:

Console.WriteLine(Numbers.Three); 

...給出一類這樣的:

public class Numbers { public const int Three = 3; } 
2
Are static variables of a given class accessible to all requests (

假設一個服務器)?據我所知,他們不是。

是的,它們可以被所有的請求訪問,如果你聲明瞭靜態變量,你可以得到相當討厭的錯誤/不一致的行爲。

你可以在類中有靜態方法,但我認爲你應該在方法中聲明你的變量,以便它們不是靜態的並且是當前線程的局部變量。

,並假定靜態/常量變量下不 到多個請求訪問,當我們鎖定(someLockObject)它 不應該阻止其他請求,因爲「鎖」獲得與該對象關聯的獨家 鎖。再次,該對象(即。 someLockObject)是我的假設下,所有的請求不同

由於您最初的假設是錯誤的,上述說法也是錯在這個意義上,如果你鎖定(someObjectLock),它會阻塞其他線程,直到當前線程的持股鎖釋放它。