单例模式的创建方式有哪两种,分别怎么实现?
- 饿汉式单例
public class SingletonTest {
// 1. 类对象
private static SingletonTest instance = new SingletonTest();
// 2. 构造函数 设置为 私有权限,禁止他人创建实例
private SingletonTest() {
}
// 3. 通过调用静态方法获得单例
public static SingletonTest newInstance() {
return instance;
}
}
- 懒汉式单例
public class SingletonTest {
// 1. 创建静态内部类
private static class SingletonTestHolder {
// 静态内部类里创建单例,JVM只会加载1遍,Java虚拟机保证了线程安全性
private static SingletonTest instance = new SingletonTest();
}
// 2. 构造函数设置为私有权限,禁止他人创建实例
private SingletonTest() {}
// 3. 延迟加载,按需创建
public static SingletonTest getInstance() {
// 在调用装载被初始化时,会初始化它的静态域,从而创建单例;
return SingletonTestHolder.instance;
}
}