【问题标题】:Is calling a static method from an instance method thread safe?从实例方法线程调用静态方法是否安全?
【发布时间】:2015-09-03 10:28:59
【问题描述】:

在下面的例子中调用实例方法RenderHelp是线程安全的吗?它调用Helper 类的静态方法,但不使用该类的任何静态变量。 如果 2 个或更多不同的 Helper 实例(每个都在不同的线程上运行)调用 RenderHelp,会曾经有问题吗?

public class Helper
{
    public string ID { get; set; }
    // other fields

    static int[] Multiply(int[] a, int[] b)
    {
        if (a.Length == b.Length) return a.Zip(b, (a1, b2) => a1 * b2).ToArray();
        else return null;
    }

    static int[] Add(int[] a, int[] b)
    {
        if (a.Length == b.Length) return a.Zip(b, (a1, b2) => a1 + b2).ToArray();
        else return null;
    }

    public int[] RenderHelp(string help, int[]a, int[] b)
    {
        if (help == "Add".ToLower()) { return Add(a,b); }
        else if (help == "Multiply".ToLower()) { return Multiply(a,b); }
        else return null;
    }
}

非常感谢相关 MSDN 或其他文档的链接。谢谢。

*另外为什么stackoverflow不能像上面那样正确格式化get

【问题讨论】:

  • 一个方法无法分辨谁在调用它。因此,调用者是静态的还是实例的都没有区别。它不会影响任何事情。
  • 但是实例方法属于实例对象。不是在创建实例对象时制作的副本吗?
  • 听起来你应该学习一些 C# 基础知识。在不了解您的语言的基本操作原理的情况下进行编程是很危险的。 Stack Overflow 也是解决初学者问题的好地方,请随时提问。
  • @AAA - 创建实例时复制实例方法。创建的只是类的字段/属性。
  • 抱歉,我的意思是一个对实例进行操作,而另一个属于该类。但你明白我的问题吗?我注意到在 stackoverflow 上的大多数其他类似问题都使用在不同线程上调用的静态类的静态方法。这里我们有一个非静态类,其中一个静态方法在不同的线程上被调用

标签: c# .net multithreading c#-4.0 thread-safety


【解决方案1】:

是的,这是线程安全的。线程问题通常发生在共享资源周围,您在这里没有这样做。这是遵循Microsoft threading 的建议:

避免提供改变静态状态的静态方法。共同点 服务器场景,静态状态在请求之间共享,这意味着 多个线程可以同时执行该代码。这打开了 线程错误的可能性。考虑使用设计模式 将数据封装到不共享的实例中 请求。

如果您要在这些函数的某处使用静态变量,那么除非您开始使用锁定或其他线程安全的方式来处理该变量,否则它不会是线程安全的。

【讨论】:

  • 如果我没听错的话,即使我发送引用变量,它是线程安全的吗?例如,如果两个Helper 实例同时调用它们各自的RenderHelp 方法,并且两个RenderHelp 方法都尝试访问相同的静态方法Add,是否有可能其中一个可以设置int[] a 而另一个@ 987654327@?
  • @AAA: 除非传入RenderHelp()ab 数组变量与通过2 个不同线程传入的完全相同,否则您将没有问题。 Add() 中的代码将对赋予它的变量进行操作,这些变量在不同线程上不会出现污染或交叉。
  • 非常感谢。只是想在用更大的代码实现之前确认这一点。
  • @AAA 它有帮助,请随时投票和/或接受这个作为答案:)
  • 我想投票,但我不能......直到我有 15 个声望点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
相关资源
最近更新 更多