为什么单例
很多时候,我们只允许内存中只能存在一个实例,比如在windows中只能存在一个资源管理器窗口,如果弹出多个,就会存在多个窗口显示不一致的状态,假设这些窗口一致,那就是重复对象,就是浪费。所以要确保系统中某个对象只有一个实例相当重要。这里提一下,spring初始化bean默认使用单例。
好处:
- 内存中只有一个对象,节省内存空间。
- 避免频繁的创建销毁对象,可以提高性能。
创建方式
单例的创建方式有很多,常见的有懒汉模式,饿汉模式,静态内部类。
静态内部类
我见最多的是静态内部类的方式,所以先贴上代码:
public class TestSingleton {
private TestSingleton(){}
private static class Singleton {
private static TestSingleton instance;
static {
instance = new TestSingleton();
}
public static TestSingleton getInstance() {
return instance;
}
}
public static TestSingleton getInstance() {
return Singleton.getInstance();
}
}
静态内部类在调用getInstance()方法时才进行加载,而这种方法又是线程安全的,为什么线程安全?java虚拟机允许,同一个加载器下,一个类型只会初始化一次