2009-10-22 135 views
0

我的問題的快速版本:.NET多線程同步

是否只有在訪問同一個對象實例時需要使用「鎖定」?例如,如果我在我的線程入口方法中實例化新的所有東西,我是否必須擔心鎖定任何對象?

詳細我的問題的說明:

我的情況是,我有一個唯一的標識符工作對象,而且工作對象中有1種方法。在該方法中,我創建了多個Web服務代理的新實例,並將從這些調用中檢索到的信息存儲在工作對象的公共屬性中。一旦所有工作完成(所有線程都完成),我將信息存儲到數據庫中。

任何理由考慮使用「鎖」?

回答

1

您只需要在不應同時運行的一段或多段代碼上使用lock。例如,如果您的代碼在多個線程上使用相同的List<T>,則需要使用鎖定。

對於你的情況,如果你有一個單獨的工作對象每個線程,如果他們不與任何其他工作對象交互或訪問任何共享狀態,你應該沒問題。

對於一個更具體的答案,請發佈更多的細節,或者,最好是來源。


編輯:在回答你的評論,它取決於InvokeService實施。只要它不訪問任何其他靜態成員,你可能會運行良好,沒有任何鎖。

0

你說得很對 - 你不需要鎖定不在線程間訪問的對象。

但是,請注意,沒有全局資源(即I/O流),它們在沒有同步的情況下被多個線程訪問。

+0

關於I/O流,我可能會最接近的是,我的線程入口方法也訪問網站來解析數據。我正在創建一個'StreamReader'來分析HttpWebResponse對象的值。 – Benny 2009-10-22 02:25:23

0

如果您正在從多個線程訪問靜態字段或屬性,則只需使用lock關鍵字。

+0

爲了明確,只有在訪問靜態字段和屬性時才使用鎖定。靜態方法不需要它嗎? – Benny 2009-10-22 02:36:08

+0

這取決於靜態方法的作用。 – SLaks 2009-10-22 02:44:58

+0

靜態與它無關(儘管它是「線程惡意代碼」的常見原因)。對同一對象的引用也可能以其他方式結束於不同的線程中(例如,由多個線程執行的可運行類中的字段) – 2009-10-22 03:11:42