一、什么是单例
确保任何情况下都只有一个实例,并提供一个全局访问点。它属于创建型模式。
二、单例分类
饿汉式单例、懒汉式单例、注册式单例、ThreadLocal单例
接下来我们分别看一下这些单例的写法
1.饿汉式单例
第一种写法:
public class StaticHungryHanSingleton {
private static final StaticHungryHanSingleton hungryHanSingleton = new StaticHungryHanSingleton();
private StaticHungryHanSingleton() { }
public static StaticHungryHanSingleton getInstance() {
return hungryHanSingleton;
}
}
第二种写法:
public class StaticHungryHanSingleton {
private static final StaticHungryHanSingleton hungryHanSingleton;
static {
hungryHanSingleton = new StaticHungryHanSingleton();
}
private StaticHungryHanSingleton() { }
public static StaticHungryHanSingleton getInstance() {
return hungryHanSingleton;
}
}
饿汉式单例的优缺点:
优点:在调用的时候已经创建好,执行效率高
缺点:程序一运行就创建,容易造成资源浪费;能够被反射破坏
2.懒汉式单例
第一版:
public class LazyHanSingleton {
private static LazyHanSingleton instance;
private LazyHanSingleton() {}
public static LazyHanSingleton getInstance() {
if (instance == null) {
instance = new LazyHanSingleton();
}
return instance;
}
}
优点:节省内存
缺点:执行效率低;线程不安全;