为什么volatile变量通常是私有的?

时间:2011-02-02 04:18:51

标签: c# multithreading volatile

我有两个类 - 类“MyDerived”派生自抽象基类“MyBase”。此外,PrimaryDerivedClass也会继承MyBase。 我首先创建PrimaryDerivedClass的实例,然后创建“MyDerived”的实例。

MyBase有一个名为ProcessThread的受保护方法,当创建ThreadPool.QueueUserWorkItem(ProcessThread)PrimaryDerivedClass的新实例时,该方法与MyDerived类似。现在,当我想在某些情况下停止所有线程时,我将一些布尔volatile变量设置为TRUE,当任何其他线程找到volatile变量的值= TRUE时,它将停止处理。

当我在private volatile bool stopThreads中声明“MyBase”时,我没有达到预期的行为。但是,当我创建staticpublic时,我可以看到我想要实现的目标。 在私有易变的情况下会出现什么问题?

除了上述要求外,我还有一个问题: 通常,我看到volatile变量被声明为private。是否有任何重要方面,因为它通常被宣布为私有?

(我是多线程新手。)

3 个答案:

答案 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 - 本文介绍了访问修饰符的含义。