共享成员(const)的类的静态方法将是线程安全的吗?

时间:2011-12-21 12:56:39

标签: c#

public class Sample{

  private const ="constant string";

  public static object StaticMethod(args){

    var result= SomeOtherClass.StaticMethod(const,args);

    return result;

  }

}

这段代码是否是线程安全的?

3 个答案:

答案 0 :(得分:2)

您需要添加锁定以确保线程安全,特别是如果SomeOtherClass.StaticMethod有副作用。静态不会自动使函数线程安全。

一般来说,如果您所做的只是阅读,那么就没有线程安全问题(除了资源争用之外)。

答案 1 :(得分:1)

你的问题无法回答。

完全取决于静态方法的作用 例如,如果静态方法访问UI,即使从锁内部调用它也不会是线程安全的。

答案 2 :(得分:1)

常量通过各种方式是线程安全的,因为它们在编译期间被编译成它们的实际值,并且它们的值在程序执行期间永远不会改变,无论有多少线程正在访问它:)

一旦你编译了代码,编译器会将const变量的所有引用替换为常量的实际值,在你的情况下它是“常量字符串” 因此它的生命周期永远不会改变。直到你自己更改常量变量的值并重新编译代码。

我提供了Eric Lippert的参考资料,因为他是C#编译器团队的主要开发人员。

来自Eric's blog

  

不可变数据结构的一个备受欢迎的好处是   他们是“线程安全的”。 因为无法写入,所以永远不会   遇到写操作中途中断的情况   线程切换,导致另一个线程读取不一致的数据   结构即可。然而,仅仅因为一个人认为这是一种谬论   数据结构不承认任何改变其内容的方式   实现必须是线程安全的!