2009-12-18 88 views
0

我有一個Windows服務託管幾個WCF服務。在我的Windows服務中,我有單身行爲的幾個對象。這些對象可以通過外部的WCF服務訪問。一個調用可以將一個值放入對象中,另一個調用可以檢索該值。共享對象和多線程問題。我應該在乎嗎?

我應該關心多線程問題嗎?我沒有自己開始任何線程。但無論如何,我應該在訪問單例對象時進行任何鎖定嗎?訪問對象的方法怎麼樣?他們不應該被標記爲同步?

編輯這些對象不是單身人士。這些對象是使用具有單例行爲的IoC創建的。

回答

2

每次調用到你的服務是一個線程它自己的。 所以你甚至開始創建線程,其中很多。

我不打算討論我對單身人士的立場等。但是,當你有共享可變數據時,你思考如何保護它免受併發訪問。 如果在線程b正在尋找某些內容時線程將某些東西放在那裏,那麼您可能會得到不可預知的結果。

最明顯的解決方案是使用鎖來讀取和寫入。 查看文檔到ReaderWriterLockSlim這應該讓你開始。

+0

我的一個朋友也指出我在System.Threading中也有一個Semaphore類。你怎麼看 ?它看起來像這個類只控制對資源池的訪問。 – user137348 2009-12-18 15:24:11

+0

如果你想開始簡單,你可以輕鬆地使用C#的「鎖定」語句。這只不過是Monitor類中的語法糖。但是,請確保不要讓您調用的實例在您的單例類之外可見,以防止自己死鎖。 – 2009-12-18 15:43:17

1

是的,我想你應該。不久之前就有人問過類似的東西。

Object that is needed throughout the application

一些解釋

Implementing Singleton in C#看到這,看着多線程辛格爾頓

而且Ist way of implementing Singleton Pattern in C#:正在尋求實現在C#Singleton模式的IIIrd方式:簡單的多線程Singleton模式和C#實現Singleton模式的IVth方式:多線程的Singleton模式

+0

+1不要介意有用的參考資料,只是簡單地爲「是」 – 2009-12-18 14:40:19

+2

如果單例是不可變的,那麼只是使單例模式樣板代碼線程安全不會有多大幫助。如果他正在做下面的事情(我認爲他是),他必須確保如何鎖定這些重新設計單人.Instance.AddSome(123,「some」); Singleton.Instance.GimmeSome(123); – 2009-12-18 14:44:03

+0

是的,那是真的。 – 2009-12-18 14:45:25