我有两个类 - 类“MyDerived
”派生自抽象基类“MyBase
”。此外,PrimaryDerivedClass
也会继承MyBase
。
我首先创建PrimaryDerivedClass
的实例,然后创建“MyDerived
”的实例。
MyBase
有一个名为ProcessThread
的受保护方法,当创建ThreadPool.QueueUserWorkItem(ProcessThread)
和PrimaryDerivedClass
的新实例时,该方法与MyDerived
类似。现在,当我想在某些情况下停止所有线程时,我将一些布尔volatile变量设置为TRUE,当任何其他线程找到volatile变量的值= TRUE
时,它将停止处理。
当我在private volatile bool stopThreads
中声明“MyBase
”时,我没有达到预期的行为。但是,当我创建static
或public
时,我可以看到我想要实现的目标。
在私有易变的情况下会出现什么问题?
除了上述要求外,我还有一个问题: 通常,我看到volatile变量被声明为private。是否有任何重要方面,因为它通常被宣布为私有?
(我是多线程新手。)
答案 0 :(得分:2)
不将访问修饰符从私有更改为公共对volatile字段的行为没有任何影响(至少不是波动率)。您还有其他一些问题,如果没有看到您的代码,我们就无法猜测。
调试多线程很难,因为代码执行的方式是非确定性的 - 你无法预测线程的精确运行时间。
volatile字段是私有的这一事实是它们在类内部用于同步。它们是其实现的一部分,而不是它的界面。
答案 1 :(得分:1)
易失性字段是私有的,因为它们是字段,而不是易失性字段。如果需要公开值,请使用属性,这样可以隐藏实现细节。
在这种情况下,您可能会将volatile Boolean
更改为ManualResetEvent
,而无需更改任何调用obj.StopThreads = true
的代码。可能有人认为,一个名为Stop()的方法将比一个属性更好。
答案 2 :(得分:1)
这种“奇怪”的行为仅仅是因为访问修饰符。 Private表示只能从定义的类中访问此变量。所有派生类都无权访问它,因此当您更改基类的volatile变量的值时,它将更改基类内部仅用于 。
从基础继承的所有类都应该有自己的stop-right-now实现。但是当你将这个变量设置为public(这意味着没有访问限制,可以从任何地方访问)或静态(这意味着所有实例的值都相同,因为它'不属于'实例而是属于类而且可以访问时)一切都会改变按类名而不是实例)。如果您希望变量可以被衍生产品访问,则应将其标记为受保护。
http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx - 本文介绍了访问修饰符的含义。