J2EE标准的ServletContext、ServletContextConfig,Spring的ApplicationContext,数据库的连接池等都是单例的形式。
饿汉式单例模式是很常见的一种模式,顾名思义就是在类加载的时候就立即初始化,创建单例的对象。
Spring Ioc容器的ApplicationContext就是饿汉式
饿汉式单例奥义
- 构造器私有
- 提供getInstance()方法
- 类加载的时候就初始化
饿汉式单例写法
写法1
public class HungrySingleton {
private static final HungrySingleton HUNGRY_SINGLETON = new HungrySingleton();
/**
* 这里构造器一定要私有
*/
private HungrySingleton() {
}
/**
* 对外暴露这个getInstance()方法即可
* @return
*/
public static HungrySingleton getInstance() {
return HUNGRY_SINGLETON;
}
}
写法2
静态代码块的形式
public class HungrySingleton2 {
private static final HungrySingleton2 HUNGRY_SINGLETON;
static {
HUNGRY_SINGLETON = new HungrySingleton2();
}
/**
* 这里构造器一定要私有
*/
private HungrySingleton2() {
}
/**
* 对外暴露这个getInstance()方法即可
* @return
*/
public static HungrySingleton2 getInstance() {
return HUNGRY_SINGLETON;
}
}
差别不大;
小结
由于是在类加载的时候就进行初始化了,所以,如果存在很多饿汉式单例,实际又用不上那么多实例,那就是占着茅坑不拉屎,浪费内存了,但是像ServletContext、ApplicationContext,就比较适合饿汉式,毕竟你总不能web项目不用Servlet容器,导了Spring不用IoC吧?