【问题标题】:Static initializers and thread synchronization (.NET)静态初始化器和线程同步 (.NET)
【发布时间】:2009-06-25 17:25:41
【问题描述】:

静态初始化程序应该在第一次引用类之前执行一次。这意味着每次访问一个类时,都应该检查该类的静态初始化器是否被执行。
似乎在多线程环境中,具有重要静态初始化程序的类可能成为争用的来源,因为当多个线程访问该类时需要同步。
我的问题是,将这种隐式锁对静态初始化程序引入的类定义的影响降到最低的最佳方法是什么?

【问题讨论】:

    标签: .net multithreading static initialization static-initializer


    【解决方案1】:

    静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

    • 创建了一个类的实例。
    • 类的任何静态成员都被引用

    调用静态构造函数时处理并发问题应该是类加载器的责任。

    【讨论】:

      【解决方案2】:

      我认为没有太多争论。初始化程序在类加载时运行。如果该类已加载,则不必进行检查。

      【讨论】:

      • 好吧......一个新生成的线程如何知道该类已经被加载?它仍然需要与中心的某些人交谈才能找到答案。
      • 那是虚拟机的职责。如果虚拟机没有任何巧妙的技巧/锁定来实现这一点,我永远都不想开发单个 .NET 应用程序。
      • 虚拟机保留一个已经加载的类列表。当需要对一个类采取行动时,vm 会查看列表以查看它是否已加载。如果是这样,静态初始化程序甚至永远不会发挥作用。如果不是,则类加载器接管并调用初始化程序。
      【解决方案3】:

      规范说“在第一次使用该类的静态字段之前在依赖于实现的时间执行。”。

      因此,可以假设(如果您悲观的话,也可以希望)实现已经发现他们需要关心线程同步。

      【讨论】:

      • 我更倾向于“希望”。正如 Ronald Reigan 常说的“doverjaj no proverjaj”,或者在英语中 trust but verify。你能想出什么方法来验证静态初始化器不应该是一个问题吗?
      【解决方案4】:

      我相信这是 JIT 编译的一部分。一旦静态初始化器被 jitted 并运行,它就不再需要运行它,因此不会出现多线程同步问题。当然,JIT 引擎将是线程安全的。

      尼克。

      【讨论】:

        猜你喜欢
        • 2011-06-04
        • 1970-01-01
        • 2013-09-03
        • 2010-10-27
        • 2010-12-31
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多