我必须证明我要问的最好的例子是 Singleton 模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
在此代码中,引入静态变量以避免ANY需要同步以获取指向Singleton实例的指针。有办法知道这是怎么发生的吗?如何实现静态?
答案 0 :(得分:4)
在加载类时初始化静态字段,以防止多个线程同时初始化它们。有关其工作原理的详细信息,请参阅JLS 12.4.2。在您的代码中,在该类加载之后没有其他任何东西设置static
字段的值,因此它唯一的值是在类加载时实例化的值。
您可以/应该通过标记字段final
来使其更清晰(并且在代码更改方面更具前瞻性)。根据JLS,这可能也是完全线程安全所需要的(虽然这实际上是not a problem in practice)。
轻微的自我:上面段落中的“类加载”实际上是“类实例化”,这实际上是在加载之后发生的步骤,如JLS所定义。我把它称为“加载”,使其明显不同于静态字段的实例化。尽管类加载只是类初始化的一个步骤(如上面的JLS 12.4中所定义),但整个过程有时会缩短为“类加载”。
答案 1 :(得分:1)
类的静态属性在类由jvm加载时加载,因为这在运行时只发生一次。保证静态属性只创建一次。