2011-02-02 84 views
1

我有兩個類 - 類'MyDerived'派生自抽象基類'MyBase'。另外PrimaryDerivedClass也繼承MyBase。 我首先創建PrimaryDerivedClass的實例,然後創建'MyDerived'的實例。爲什麼volatile變量通常是私有的?

MyBase有一個稱爲ProcessThread受保護的方法,其用於像ThreadPool.QueueUserWorkItem(ProcessThread)創建PrimaryDerivedClassMyDerived的新實例時。現在,當我想在某些場景中停止所有線程時,我將一些布爾型volatile變量設置爲TRUE,並且當其他線程發現volatile變量的值= TRUE時,它將停止處理。

當我在MyBase中聲明'private volatile bool stopThreads'時,我沒有得到預期的行爲。但是,當我製作它staticpublic我可以看到我想要的。 在私人易變的情況下會出現什麼問題?

除了上面的要求,我還有一個問題: 通常,我已經看到volatile變量被聲明爲private。有沒有什麼重要的方面,因爲它通常是私人的?

(我新的多線程。)

+1

您可能想要避免volatile:http://www.bluebytesoftware.com/blog/2010/12/04/SayonaraVolatile.aspx – TrueWill 2011-02-02 04:54:13

+0

@TrueWill:非常感謝。 – Learner 2011-02-02 05:25:00

回答

2

沒有私人改變訪問修飾符公衆不會對揮發場的行爲沒有任何影響(至少不會是波動)。您還有其他問題,如果沒有看到您的代碼,我們無法猜測。

調試多線程很困難,因爲代碼執行的方式是非確定性的 - 您無法預測您的線程何時可以正常運行。

易失性字段是私密的這一事實是,它們被類用於內部同步。它們是其實現的一部分,而不是它的接口。

1

易變場是私密的,因爲它們是場,不易揮發。如果您需要公開值,請使用允許您隱藏實現細節的屬性。

在這種情況下,您可能會將volatile Boolean更改爲ManualResetEvent,而無需更改任何代碼,即obj.StopThreads = true。有人可能會認爲名爲Stop()的方法會比一個屬性更好。

1

這種「奇怪」的行爲僅僅是因爲訪問修飾符。私有意味着該變量只能從定義的類訪問。所有派生類都無法訪問它,所以當您更改基類的易失性變量的值時,它將更改爲基類內部只能工作

所有從基地繼承的類都應該有自己的stop-right-now實現。但是,如果將此變量設置爲public(意味着沒有訪問限制,可從任何地方訪問)或靜態(這意味着所有實例的值都相同,因爲它「屬於」不屬於實例,而是類並且可訪問按類名稱而不是實例)。如果你希望你的變量可以被衍生品訪問,你應該將其標記爲受保護的。

http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx - 本文顯示訪問修飾符的含義。