我想知道如果我可以安全地從多線程使用SelectNodes()和SelectSingleNode()從一個XmlDocument對象讀取沒有問題。 MSDN表示他們不能保證線程安全。如果SelectNodes()和SelectSingleNode()確實存在從多個線程運行的問題,我可以使用正確的鎖定來避免任何問題嗎?我有一個WCF服務設置,需要從數據庫中獲取一大塊xml,並從這個xml中選擇一些信息。我想緩存xml以避免經常碰到數據庫,但我擔心線程的安全性和性能。有沒有更好的方式去做這件事?謝謝正在從XmlDocument對象讀取線程安全嗎?
3
A
回答
5
這是交易。如果文檔說實例方法不能保證線程安全,那麼你最好注意一下。如果您決定在沒有適當的同步機制的情況下使用多線程場景中的類,那麼您需要了解忽略文檔的後果,以及2)爲所有假設準備在未來版本的課程中失效。即使對於似乎只讀取內部狀態的方法,此建議也是有效的。
你怎麼知道SelectNodes和SelectSingleNodes不修改內部變量?因爲如果他們這樣做,他們絕對不是線程安全的!現在,我碰巧使用了Reflector來查看裏面,我可以看到他們不修改任何內部變量。但是,你怎麼知道這在未來的版本中不會改變?
現在,由於我們實際上知道SelectNodes和SelectSingleNodes不會修改類的內部狀態,因此儘管出現警告,但只有在以下條件適用的情況下,它們纔可以用於多線程操作。
- 在初始化XmlDocument之後,除了SelectNodes或SelectSingleNode之外,沒有其他方法被調用... ever。因爲我沒有檢查過XmlDocument類中的所有方法,所以我不能說哪些修改了類的內部狀態,哪些不修改,結果我會考慮除了我剛纔提到的兩種方法之外的所有方法,鎖定免費的方法來使用該類。
- 在一個線程上初始化XmlDocument之後,在另一個線程上調用SelectNodes或SelectSingleNodes之前,會創建顯式或隱式內存屏障。我應該注意到,由於獲得多線程環境設置,內存屏障很可能會爲您隱式創建。但是,我可以想到一些細微的情況,這種情況下,這種情況。
我的建議...從字面上理解文檔中的警告並使用適當的同步機制。
0
SelectNodes/SelectSingleNode應該是安全的(它們只讀取數據)。當然,你需要將這些與任何實際修改xml的方法進行同步。
2
正如您要寫入/從XML文檔讀取/ /如果您不想運行競爭條件需要同步這兩個操作。如果你關心性能(誰不關心?)ReaderWriterLockSlim可能比鎖定更好。
0
當您調用createInstance時,您還可以使用MsXml FreeThreadedDOMDocument模型而不是古典DomDocument。
請注意,根據this article,FreeThreadedDOMDocument比傳統DomDocument慢7倍或10倍。
相關問題
- 1. 正在讀/ dev/urandom線程安全嗎?
- 2. C++流對象線程安全嗎?
- 3. EF對象是線程安全的嗎?
- 4. 這會使對象線程安全嗎?
- 5. 這是鎖定線程安全的正確對象嗎?
- 6. java線程安全:線程安全嗎?
- 7. 多線程讀取靜態對象是否安全?
- 8. Python:安全地讀取線程中的對象的值?
- 9. 將本地新對象傳遞給線程,線程安全嗎?
- 10. 緩衝讀寫器線程安全嗎?
- 11. 位圖線程安全只讀嗎?
- 12. 在Python線程安全嗎?
- 13. 在scala對象中,是不可變的val線程安全嗎?
- 14. 從ifstream中讀取stdin/cin安全嗎?
- 15. 存儲在線程安全集合線程中的對象是否安全?
- 16. 是java中整數線程安全讀取的不同步嗎?
- 17. stl向量併發讀取線程安全嗎?
- 18. 此UIImage數據讀取器線程安全嗎?
- 19. 多線程寫入,一個線程從隊列中讀取,線程安全
- 20. 只讀線程安全
- 21. ServletContext對象的線程安全
- 22. 線程安全對象 - 是否靜態?
- 23. GridFS Java對象是否線程安全?
- 24. 線程不安全的對象
- 25. C++線程安全的對象
- 26. 靜態對象線程安全
- 27. python線程安全對象緩存
- 28. 什麼是線程安全的對象
- 29. Java:String對象的線程安全
- 30. 訪問只讀對象列表<>的線程安全
我不需要修改實際的XML,所以我不關心寫入它,只是讀它。當我創建XmlDocument並將其分配給我的靜態變量時,我需要鎖定它。雖然我不熟悉ReaderWriterLockSlim。 – Tallek 2009-11-09 20:03:54
您應該關注編寫,因爲XML文檔本身不會自動填充,並且如果您在填寫時有人試圖從中讀取它,那麼他將遇到競爭狀況。 – 2009-11-09 20:06:34