单例模式
单例模式, 顾名思义就是只有一个实例, 并且它自己负责创建自己的对象, 这个类提供了一种访问其唯一的对象的形式. 可以直接访问, 不需要实例化该类的对象.
单例模式的几种形式
饿汉式
class Singleton {
private Singleton() {
}
private static Singleton instance = new Singleton();
public static Singleton newInstance() {
return instance;
}
}
实例在类初始化的时候就创建好了, 不管你有没有用到. 好处是没有线程安全问题, 坏处是比较浪费内存空间.
懒汉式
class Singleton {
private Singleton() {
}
private static Singleton instance;
public static Singleton newInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉式, 顾名思义就是实例在用到的时候才去创建.
有线程安全和不安全两种写法, 区别就是synchronized
关键字
双检锁
class Singleton {
private Singleton() {
}
private static Singleton instance;
public static Singleton newInstance() {
if (instance == null) {
// 第一次检查, 有则返回 (此时尚未加锁, 可以提高效率)
synchronized(Singleton.class) {
if (instance == null) {
// 第二次检查, 再获取到锁之间, 再次检查是为完成初始化
instance = new Singleton();
}
}
}
return instance;
}
}
双检锁, 又叫双重校验