1.静态内部类
静态内部类:第一次引用静态内部类的静态成员或调用静态方法时,会触发该静态内部类的加载
2.代码实现
- 在这里,
Singleton
的实例INSTANCE
被设置为静态内部类SingletonHandler
的静态成员 - 当我们第一次调用
getInstance
方法,访问了SingletonHandler.INSTANCE
,由于SingletonHandler
是静态内部类,那么根据静态内部类的特性,就会触发该静态内部类的加载,即JVM就会帮我们完成静态成员INSTANCE
的创建,这样子,JVM帮我们保证了线程安全,而且这还是懒加载的方式(需要才创建) - 后续再调用
getInstance
方法,由于INSTANCE
已经创建好了,所以直接返回即可
静态内部类这就讲完了,哈哈,是不是比懒汉式-“双重检查锁+volatile“的实现方式简单很多,所以用静态内部类实现单例比较推荐
注意:这里要将静态内部类SingletonHandler
私有化,只能在Singleton
内部使用
3.代码测试
public class TestDemo {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println("s1 == s2: " + (s1 == s2)); // s1 == s2: true
}
}
4.总结
- 优点
- 实现简单
- 线程安全
- 支持延迟加载
- 支持高并发
- 缺点
- 由于在Singleton内部构建了静态内部类SingletonHandler,导致Singleton的结构略显复杂