C# : What if a static method is called from multiple threads?

标签 c# multithreading static

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

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

最佳答案

在方法内部声明的变量(“捕获”变量可能除外)是隔离的,因此您不会遇到任何固有问题;但是,如果您的静态方法访问任何共享状态,则所有赌注均无效。

共享状态的例子是:

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

如果你有共享状态,你必须:

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

关于C# : What if a static method is called from multiple threads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3037637/

相关文章:

java - 在 onPostExecute 中的 notify() 之前没有被线程锁定的对象

c - 不同文件中同名的静态变量

c# - 来自其他 dll 的 PropertyInfo GetCustomAtributes

java - 调用notify后线程状态

multithreading - Kafka流中通过线程分配的策略是什么?

java - 静态 block 永远不会运行

java - 'static' 关键字在类中的作用是什么?

c# - 将 JSON 对象映射到 C# 类属性

c# - 如何为我的项目执行代码覆盖率。我在specflow中编写了单元测试

c# - 有没有办法使用 Resharper 通过一个模板/宏生成多个文件?