我有一個WCF應用程序從客戶端應用程序接收一些字符串數組。然後,這些數組作爲參數傳遞給一些自定義類的構造函數。我不是,我自己,創建任何線程(甚至不使用System.Threading
),但我想知道是否在每個構造函數中使用lock (param.SyncRoot)
只是爲了安全起見而不行嗎?那是因爲我讓所有的對象都是不變的,我想確保數組不會被改變。在構造函數上鎖定數組
0
A
回答
2
我認爲你是過於複雜的事情。
使用線程保持事情儘可能簡單的主要事情之一是明確鎖定的責任。因此,如果您不創建任何線程,則不需要鎖定,鎖定只是使事情變得複雜,但不會增加任何值 - 壞的庫仍然會失敗。
鎖定應該在您創建和使用的對象內完成。
1
如果要使對象不可變,您必須創建數組的深層副本並將該副本存儲在對象中。如果數組包含引用類型,則也不必公開數組。在構造函數中鎖定數組是不可能的(鎖在using
語句中使用 - 當語句結束的時候也會結束)。此外鎖定整個生命週期的陣列是無稽之談。
不可變性本身與鎖定無關。鎖定是爲了防止從多個線程同時訪問你的對象 - 你提到你沒有這樣做。不變性意味着你的對象有狀態,狀態不能改變 - 它在構造函數中定義,並且在對象的整個生命週期內保持不變。創建不可變對象時,它們不能與其他對象共享引用,並且不能將對其狀態的引用公開,因爲這樣可以修改它們的狀態。
1
如何使對象不可變與您的構造函數無關,或與如何將數據從一個對象傳遞到另一個對象無關。
一旦接收對象獲取的陣列,無論是通過構造函數或其他方式,你可以抽成一個ReadOnlyCollection:
ReadOnlyCollection<Customer> _customers = new ReadOnlyCollection<Customer>(arrayPassedViaConstructor)
現在,每個對象都有其自己的,不可修改的,數組的副本。即使原始數組(在調用對象中)確實發生了變化,接收對象中的只讀副本也不會。
相關問題
- 1. Scala數組構造函數?
- 2. 構造函數數組
- 3. 在構造函數和析構函數中鎖定共享資源
- 4. PHP:函數像數組構造函數
- 5. 構造函數和數組在html中
- 6. 構造函數內的構造函數
- 7. 如何在構造函數數組中找到復制構造函數
- 8. 數組中的大數 - 構造函數
- 9. C++數組構造函數的參數
- 10. 構造函數(構造函數名稱)未定義
- 11. Ninject構造函數綁定
- 12. 構造函數未定義
- 13. 定義構造函數NEWTYPE
- 14. 在對象數組上覆制構造函數
- 15. 在構造函數上初始化數組
- 16. 在類構造函數或定義時初始化數組?
- 17. 構造函數
- 18. 數組默認構造函數
- 19. Java中數組的構造函數
- 20. 對象構造函數的C++數組
- 21. 模型構造函數返回數組
- 22. 組件構造函數參數fxml javafx
- 23. 數組,構造函數和實例
- 24. 複製構造函數[數組] C++
- 25. 構造函數未設置數組
- 26. Actionscript關聯數組的構造函數?
- 27. 構造函數中的調用基構造函數和其他構造函數
- 28. 構造函數在JavaScript中的構造?
- 29. numpy的函數數組構造函數中的lambda函數
- 30. 使用導致空引用的構造函數進行鎖定?
你可以展示一些你現在做什麼的代碼示例嗎? – ChrisWue