2011-06-27 59 views
0

我有一個WCF應用程序從客戶端應用程序接收一些字符串數組。然後,這些數組作爲參數傳遞給一些自定義類的構造函數。我不是,我自己,創建任何線程(甚至不使用System.Threading),但我想知道是否在每個構造函數中使用lock (param.SyncRoot)只是爲了安全起見而不行嗎?那是因爲我讓所有的對象都是不變的,我想確保數組不會被改變。在構造函數上鎖定數組

+0

你可以展示一些你現在做什麼的代碼示例嗎? – ChrisWue

回答

2

我認爲你是過於複雜的事情。
使用線程保持事情儘可能簡單的主要事情之一是明確鎖定的責任。因此,如果您不創建任何線程,則不需要鎖定,鎖定只是使事情變得複雜,但不會增加任何值 - 壞的庫仍然會失敗。
鎖定應該在您創建和使用的對象內完成。

1

如果要使對象不可變,您必須創建數組的深層副本並將該副本存儲在對象中。如果數組包含引用類型,則也不必公開數組。在構造函數中鎖定數組是不可能的(鎖在using語句中使用 - 當語句結束的時候也會結束)。此外鎖定整個生命週期的陣列是無稽之談。

不可變性本身與鎖定無關。鎖定是爲了防止從多個線程同時訪問你的對象 - 你提到你沒有這樣做。不變性意味着你的對象有狀態,狀態不能改變 - 它在構造函數中定義,並且在對象的整個生命週期內保持不變。創建不可變對象時,它們不能與其他對象共享引用,並且不能將對其狀態的引用公開,因爲這樣可以修改它們的狀態。

+0

你不明白......我當然可以在任何構造函數的關鍵部分使用'lock(array.SyncRoot)'! – User

+0

如果你沒有對數組進行多線程訪問,那麼這樣做的目的是什麼? –

+0

我現在可能沒有,但以後可能會有...... – User

1

如何使對象不可變與您的構造函數無關,或與如何將數據從一個對象傳遞到另一個對象無關。

一旦接收對象獲取的陣列,無論是通過構造函數或其他方式,你可以抽成一個ReadOnlyCollection:

ReadOnlyCollection<Customer> _customers = new ReadOnlyCollection<Customer>(arrayPassedViaConstructor) 

現在,每個對象都有其自己的,不可修改的,數組的副本。即使原始數組(在調用對象中)確實發生了變化,接收對象中的只讀副本也不會。