单例模式大家平时开发都要用到,面试也经常会考到,下面咱们就说一下常用的单例模式。
1 饿汉式
懒汉式就是开始在加载类的时候就创建实例。
// 懒汉式 类加载的时候就创建实例
class SingleInstance {
private static SingleInstance instance = new SingleInstance();
private SingleInstance() {}
public static SingleInstance getInstance() {
return instance;
}
}
饿汉式优点是 线程安全 初始化就创建 缺点是初始化比较慢。
懒汉式
// 懒汉式 使用时候判断 线程不安全
class SingleInstance2 {
private static SingleInstance2 instance;
private SingleInstance2() {
}
public static SingleInstance2 getInstance() {
if (instance==null) {
instance = new SingleInstance2();
}
return instance;
}
}
这是最基本的懒汉式 意思就是人比较懒 用的时候采取创建。这种模式线程是不安全的,可以优化。
优化后懒汉式
class SingleInstance2 {
private static SingleInstance2 instance;
private SingleInstance2() {
}
public static SingleInstance2 getInstance() {
if (instance == null) {
synchronized (SingleInstance2.class) {
if (instance == null) {
instance = new SingleInstance2();
}
}
}
return instance;
}
}
优化 1 synchronized 添加同步锁 , 2 双空判断 。
第二个( == null) 判断是在 null 的情况下创建 。第一个(==null) 是 避免不必要的 同步 耗费资源。
通过静态内部类 创建单例
// 静态内部类加载模式
class SingleInstance3 {
private SingleInstance3() {
}
public static SingleInstance3 getInstance() {
return SingleInstanceHolder.instance;
}
private static class SingleInstanceHolder {
private static SingleInstance3 instance = new SingleInstance3();
}
}
静态内部类 我理解就是 饿汉式 的 优化 。保证了线安全,又不是初始化创建,不影响初始化的速度。 这个其实内部类 SingleInstanceHolder 就是一个 饿汉式一样。常用的单例一般就是这些了,说的不对的地方,请大家给我留言。
网友评论