【发布时间】:2011-03-03 12:45:57
【问题描述】:
在我的应用程序中,我有一个同时从多个线程调用的静态方法。我的数据是否有混淆的危险?
在我的第一次尝试中,该方法不是静态的,我正在创建该类的多个实例。在那种情况下,我的数据不知何故混淆了。我不确定这是怎么发生的,因为它只是有时会发生。我还在调试。 但是现在该方法是静态的,到目前为止我没有任何问题。也许这只是运气。我不确定。
【问题讨论】:
标签: c# multithreading static
在我的应用程序中,我有一个同时从多个线程调用的静态方法。我的数据是否有混淆的危险?
在我的第一次尝试中,该方法不是静态的,我正在创建该类的多个实例。在那种情况下,我的数据不知何故混淆了。我不确定这是怎么发生的,因为它只是有时会发生。我还在调试。 但是现在该方法是静态的,到目前为止我没有任何问题。也许这只是运气。我不确定。
【问题讨论】:
标签: c# multithreading static
是的,这只是运气。 ;)
方法是否静态并不重要,重要的是数据是否静态。
如果每个线程都有自己独立的类实例和自己的数据集,则不会有数据混淆的风险。如果数据是静态的,只有一组数据,所有线程共享相同的数据,所以没有办法不混淆。
当您在不同实例中的数据仍然混淆时,很可能是因为数据并不是真正独立的。
【讨论】:
It doesn't matter if the method is static or not, what matters is if the data is static or not。顺便说一句,在静态方法范围内声明的局部变量并不构成我们在给定场景中需要处理的那部分数据。
MSDN 总是说:
此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。
编辑: 正如这里的人所说,情况并非总是如此,显然这适用于在 BCL 中以这种方式设计的类,而不适用于不适用的用户创建的类。
【讨论】:
在方法中声明的变量(“captured”变量可能例外)是隔离的,因此您不会遇到任何固有问题;但是,如果您的静态方法访问任何共享状态,则所有赌注都将关闭。
共享状态的示例如下:
如果您有共享状态,则必须:
whatever.SomeData,您阅读@987654322 @ once 到一个局部变量中,然后只使用该变量 - 请注意,这只有助于不可变状态!)【讨论】:
静态方法应该适用于多线程。
另一方面,静态数据可能会导致问题,因为需要控制从不同线程访问相同数据的尝试,以确保一次只有一个线程在读取或写入数据。
【讨论】: