“静态”如何保证属性中只有一个类的实例?

时间:2013-10-25 14:42:16

标签: java thread-safety singleton

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

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

     private Singleton() {     
     }     

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

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

2 个答案:

答案 0 :(得分:4)

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

您可以/应该通过标记字段final来使其更清晰(并且在代码更改方面更具前瞻性)。根据JLS,这可能也是完全线程安全所需要的(虽然这实际上是not a problem in practice)。


轻微的自我:上面段落中的“类加载”实际上是“类实例化”,这实际上是在加载之后发生的步骤,如JLS所定义。我把它称为“加载”,使其明显不同于静态字段的实例化。尽管类加载只是类初始化的一个步骤(如上面的JLS 12.4中所定义),但整个过程有时会缩短为“类加载”。

答案 1 :(得分:1)

类的静态属性在类由jvm加载时加载,因为这在运行时只发生一次。保证静态属性只创建一次。