2

我必须证明我要问的最好的例子是单例模式

public class Singleton {     
     private static Singleton instance = new Singleton();     

     private Singleton() {     
     }     

     public static Singleton getInstance() {
          return instance;    
     } 
}

在此代码中,引入了静态变量以避免任何需要同步来获取指向 Singleton 实例的指针。有办法知道这是怎么发生的吗?静态是如何实现的?

4

2 回答 2

4

加载类时会初始化静态字段,以防止多个线程同时初始化它们。有关其工作原理的详细信息,请参阅JLS 12.4.2。在您的代码中,在该类加载之后没有其他任何东西设置该static字段的值,因此它唯一的值是在类加载时实例化的值。

您可以/应该通过标记字段来使其更清晰(并且在代码更改方面更具前瞻性)final。根据 JLS,这可能也是全线程安全所必需的(尽管这在实践中实际上不是问题)。


轻微的自学:上述段落中的“类加载”实际上是“类实例化”,这实际上是JLS 定义的加载后发生的一个步骤。我将其称为“加载”,以使其与静态字段的实例化更加明显不同。尽管类加载只是类初始化中的一个步骤(如 JLS 12.4 中定义的,上面的链接),但整个过程有时会缩短为通俗的“类加载”。

于 2013-10-25T14:53:01.157 回答
1

类的静态属性是在 jvm 加载类期间加载的,因为这种情况在运行时只发生一次。保证静态属性只创建一次。

于 2013-10-25T14:49:31.903 回答