核心概念:单例模式
- 目的:确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。
- 应用场景:比如数据库连接池、线程池、日志对象、应用的配置类等。这些对象在程序中只需要一个实例即可,创建多个实例会浪费资源或导致行为异常。
饿汉式
核心思想:'饿',顾名思义,很饥饿,所以在类加载的时候就已经创建好实例,不管后面用不用,先创建了再说。 特点:
- 线程安全:因为实例的创建是在类加载阶段完成的,这个阶段由 JVM 保证线程安全。
- 加载慢,获取快:类一加载就初始化实例,可能会稍微拖慢启动速度,但获取实例对象的速度非常快。
代码示例:
public class SingletonEager {
// 1. 私有静态实例,在类加载时就直接创建
private static final SingletonEager INSTANCE = new SingletonEager();
// 2. 私有构造函数,防止外部通过 new 关键字创建实例
private SingletonEager() {}
// 3. 公共的静态方法,用于获取唯一实例
public static SingletonEager getInstance() {
return INSTANCE;
}
}
优点:实现简单,绝对线程安全。
缺点:如果这个实例非常耗费资源,但在整个程序运行过程中又可能用不到,就会造成资源的浪费。
懒汉式
核心思想:'懒',很懒惰,所以只有在第一次被用到的时候才创建实例。 特点:
- 资源利用率高:只有在需要的时候才创建,避免了不必要的资源消耗。
- 加载快,获取慢(第一次):类加载时不初始化,第一次调用
getInstance()时才创建,所以第一次获取会稍慢。
基础版(非线程安全)
这个版本在多线程环境下会出问题。
public class SingletonLazy {
SingletonLazy instance;
{}
SingletonLazy {
(instance == ) {
instance = ();
}
instance;
}
}


