【问题标题】:C# : What if a static method is called from multiple threads?C#:如果从多个线程调用静态方法怎么办?
【发布时间】:2011-03-03 12:45:57
【问题描述】:

在我的应用程序中,我有一个同时从多个线程调用的静态方法。我的数据是否有混淆的危险?

在我的第一次尝试中,该方法不是静态的,我正在创建该类的多个实例。在那种情况下,我的数据不知何故混淆了。我不确定这是怎么发生的,因为它只是有时会发生。我还在调试。 但是现在该方法是静态的,到目前为止我没有任何问题。也许这只是运气。我不确定。

【问题讨论】:

标签: c# multithreading static


【解决方案1】:

是的,这只是运气。 ;)

方法是否静态并不重要,重要的是数据是否静态。

如果每个线程都有自己独立的类实例和自己的数据集,则不会有数据混淆的风险。如果数据是静态的,只有一组数据,所有线程共享相同的数据,所以没有办法不混淆。

当您在不同实例中的数据仍然混淆时,很可能是因为数据并不是真正独立的。

【讨论】:

  • 喜欢那条线 - It doesn't matter if the method is static or not, what matters is if the data is static or not。顺便说一句,在静态方法范围内声明的局部变量并不构成我们在给定场景中需要处理的那部分数据。
  • 很好的答案。帮了大忙。
【解决方案2】:

MSDN 总是说:

此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。

编辑: 正如这里的人所说,情况并非总是如此,显然这适用于在 BCL 中以这种方式设计的类,而不适用于不适用的用户创建的类。

【讨论】:

  • 呸!最后,我理解了这个在 MSDN 文档中经常出现的注释的含义。因此,基本上,当 MS 在 BCL 中设计静态方法(发布此注释的地方)时,它们不会访问该方法范围之外的任何变量/成员/状态。它们完全依赖于方法范围的局部变量,仅用于实现该方法的逻辑。很高兴您的分享。
  • @Marcote,不是相反吗?实例成员是安全的,因为每个实例都有一个。但是,静态成员不是线程安全的,因为它们在该类的所有实例之间共享? quora.com/…
  • 视情况而定。默认情况下,我永远不会安全地对待实例成员。这就是为什么有一整套库和避免数据损坏等许多事情的原因。
  • 好的,谢谢@Marcote。我慢慢发现我还有很多东西要学。
【解决方案3】:

在方法中声明的变量(“captured”变量可能例外)是隔离的,因此您不会遇到任何固有问题;但是,如果您的静态方法访问任何共享状态,则所有赌注都将关闭。

共享状态的示例如下:

  • 静态字段
  • 从公共缓存访问的对象(非序列化)
  • 通过输入参数获取的数据(以及这些对象的状态),如果多个线程可能接触同一个对象

如果您有共享状态,则必须:

  • 一旦可以共享状态,请注意不要改变状态(更好:使用不可变对象来表示状态,并将状态快照保存到局部变量中 - 即,而不是重复引用whatever.SomeData,您阅读@987654322 @ once 到一个局部变量中,然后只使用该变量 - 请注意,这只有助于不可变状态!)
  • 同步对数据的访问(所有线程必须同步)- 互斥或(更精细的)读取器/写入器

【讨论】:

  • @Marc 我不能完全同意“在方法中声明的变量(“捕获的”变量可能例外)是孤立的”。考虑一个在静态方法中声明的文件句柄。然后一个线程可以在其他线程使用它时访问句柄。它会导致意想不到的行为。还是您的“捕获”变量也意味着“文件句柄”。
  • @prabhakaran 如果文件句柄是方法变量,则它的范围到该调用者。任何其他调用者都将与不同的 变量 交谈(方法变量是每次调用的)。现在,访问 底层文件 是一个单独的问题,但这与 c# 或 .NET 无关。如果句柄不共享,那么如果这种情况可能发生,人们会期望某种互斥锁/锁。
【解决方案4】:

静态方法应该适用于多线程。

另一方面,静态数据可能会导致问题,因为需要控制从不同线程访问相同数据的尝试,以确保一次只有一个线程在读取或写入数据。

【讨论】:

  • 这里的关键字是同步 :-)
  • 读可以并发,但是读和写并发会导致意外的行为
猜你喜欢
  • 2012-10-04
  • 2011-09-06
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多