gpt4 book ai didi

c# - C#中静态初始化器的线程安全

转载 作者:太空狗 更新时间:2023-10-29 23:15:40 24 4
gpt4 key购买 nike

每个人都说静态初始化程序是线程安全的,但我担心一个特定的细节。

假设我有

static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}

static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}

MyStaticClass.myField 尚未初始化时,C# 保证以下哪项?

  1. 如果线程 1 和 2 尝试同时访问 myField(按此顺序),GetNewObject 将在线程之前开始执行2 读取 myField

  2. 如果线程 1 和 2 尝试同时访问 myField(按此顺序),GetNewObject 将在线程之前完成执行2 读取 myField

一般来说,CLR 怎么样:如果它的保证与 C# 的不同,它们有哪些不同?
.NET Framework 的最新版本中的行为是否发生了变化?

注意事项:

这是一个棘手的问题,我认为完整的答案可能会提到静态构造函数和静态初始化器之间的区别,以及它们如何与交互beforefieldinit 产生声明的结果。

最佳答案

案例 2 将得到尊重。类字段、属性或方法在类型初始化之前不能取消引用,并且在静态构造函数完成之前类型不会被初始化。因此,据我所知,静态构造函数是一个阻塞调用。

http://msdn.microsoft.com/en-us/library/aa645612(v=vs.71).aspx

“类的静态构造函数在给定的应用程序域中最多执行一次。”

请参阅 Eric Lippert 的回复:https://stackoverflow.com/a/9399027/2420979 并注意“cctor”是静态构造函数的 IL。

No cctors call MyMethod, directly or indirectly! Now is it ever possible for a static method like MyMethod to be called before the cctor of MyClass completes?

没有。

Is that still true even if there are multiple threads involved?

是的。在可以在任何线程上调用静态方法之前,cctor 将在一个线程上完成。

Can the cctor be called more than once? Suppose two threads both cause the cctor to be run.

无论涉及多少个线程,cctor 都保证最多被调用一次。如果两个线程“同时”调用 MyMethod,那么它们就会竞争。其中之一输掉比赛并阻塞,直到 MyClass cctor 在获胜线程上完成。

关于c# - C#中静态初始化器的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17330743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com