1

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

4

4 回答 4

1

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

于 2009-06-25T17:28:06.637 回答
1

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

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

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

于 2009-08-10T15:43:05.337 回答
0

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

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

于 2009-06-25T17:59:10.453 回答
0

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

缺口。

于 2009-07-24T14:30:34.807 回答