由于静态内部类 SingletonHolder 只有在需要时才被加载,因此实现了懒加载,同时由于在加载时会保证线程安全,因此实现了线程安全。 那什么时候一个类是立刻会被加载的,什么时候又不是呢
时间: 2023-06-17 11:08:31 浏览: 37
一个类会在以下情况下立即被加载:
1. 创建该类的实例时,其类会被立即加载
2. 该类的静态方法或静态字段被调用时,其类会被立即加载
3. 该类被作为父类继承时,其类会被立即加载
一个类不会立即被加载的情况包括:
1. 类被定义时,但是没有被引用
2. 类的静态方法或静态字段没有被调用
3. 类被声明为 final,但是没有被使用
4. 类被声明为 abstract,但是没有被实现或继承
需要注意的是,类的加载是由类加载器完成的,因此不同的类加载器可能会有不同的加载策略。
相关问题
写一个静态内部类单例代码,并在代码中加上注释,并且解释代码
以下代码为静态内部类单例模式的示例:
```java
public class Singleton {
private Singleton() {
// 私有构造方法
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
```
代码解释:
1. 外部类 `Singleton` 的构造方法被私有化,保证外部无法直接通过 `new` 关键字创建对象。
2. `getInstance()` 方法是获取单例对象的唯一公开方法,通过调用 `SingletonHolder.INSTANCE` 来获得单例对象。
3. 内部类 `SingletonHolder` 是一个静态内部类,该类内部的静态变量 `INSTANCE` 被初始化为 `Singleton` 的实例,由于是静态变量,所以只会被初始化一次,即保证了线程安全性。
4. 静态内部类 `SingletonHolder` 只有在被调用时才会被加载,而 `SingletonHolder.INSTANCE` 只有在第一次被使用时才会被初始化,即实现了懒加载。
5. 由于静态内部类 `SingletonHolder` 只有在需要时才被加载,因此实现了懒加载,同时由于在加载时会保证线程安全,因此实现了线程安全。
静态内部类实现单例
静态内部类实现单例是一种比较优秀的单例模式实现方式,它是基于类加载器的机制来保证线程安全的。具体实现方式如下:
```java
public class Singleton {
// 私有化构造函数
private Singleton() {}
// 静态内部类,用于实现单例模式
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
// 获取单例对象
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
在上面的实现中,静态内部类 SingletonHolder 中持有了 Singleton 的实例对象 INSTANCE,只有在调用 getInstance() 方法时,才会对 SingletonHolder 进行初始化,从而创建 Singleton 的实例对象。由于静态内部类 SingletonHolder 是私有的,并且只会被加载一次,因此可以保证线程安全,同时也能够延迟加载,提高了单例对象的创建效率。