2011-11-21 40 views
2

編輯:事實證明,當我在瀏覽我發現了一個問題似乎是和我一樣,我沒有發現更早:Difference between lock(locker) and lock(variable_which_I_am_using)正在使用現有對象而不是創建特定的鎖對象安全嗎?

我在看一些代碼,並試圖圍繞讓我的頭鎖定的東西,我到了那裏我想。

現在我在一些代碼注意到我檢討了對象時,像這樣創建:

private HashSet<Graphic> clustersInUse = new HashSet<Graphic>(); 

然後進一步在代碼中使用像這樣:

lock (clustersInUse) 
{ 
    // Do something with the Hashset 
} 

現在,有一個這樣做的問題,而不是爲鎖創建一個特定的對象。就像這樣:

private object clusterLocker = new object(); 

一下如果上面不知何故clustersInUse被放到一個公共財產,那麼,什麼情況?

此外,如果有東西試圖訪問clustersInUse而不鎖定它,而它被鎖定在另一個線程中會發生什麼呢?

回答

2

你幾乎已經回答了你自己的問題。對於鎖定,通常最好創建一個專門用於該目的的對象,並且通常私下使用由高級別表示同步邏輯的訪問器方法使用。

+0

因此,基本上所有的問題或潛在的問題是,爲什麼總的來說最好只是創建一個特定的鎖定對象?是否有任何情況下可以使用對象本身?也許是表現還是什麼? – Firedragon

+1

@Firedragon:它總是好的*不*使用對象本身。不要讓生活複雜化。 –

2

一般規則是,您要控制鎖定對象的範圍,以防止某些未知代碼導致意外行爲。在這種情況下,您正在使用一個私有實例變量,因此只要您不提供對其的引用,您可能就行。

如果您正在分發引用並鎖定引用並且其他代碼正在鎖定這些引用(例如,修改集合時),那麼更改行爲可能會輕鬆引入線程錯誤。

如果有人將它放入一個公共屬性中,如果它們鎖定了它,就會被視爲「發放引用」,那麼您的鎖定呼叫將被阻止,直到它們解鎖爲止。這是否合意取決於他們在收藏中所做的事情。

鎖定對象對於將其用於除同步之外的任何其他目的都沒有任何影響。

相關問題