美文网首页
Java 单例模式

Java 单例模式

作者: 索性流年 | 来源:发表于2021-02-07 10:30 被阅读0次

文集地址

一句话总结单例模式

  • 一个JVM中只有一个对象的实例,防止反复创建对象

前言

  • 单利模式隶属于创建型设置模式,其目的是为了防止实例重复创建,通过单例模式创建的类在当前进程中只有一个实例,单例模式是一种常用的软件设计模式,七种写法,分别适应了不同场景,下面一一举例。

懒汉式

  • 优点:只有在调用 getSimpleInterest() 时才会创建实例,节省资源
  • 缺点:非线程安全,不能再多线程下使用,因在调用时才初始化实例,所有第一次初始时间略长
/**
 * 懒汉式(非线程安全)
 *
 * @author ext.liuyan10
 * @date 2021/2/5 9:19
 */
public class SimpleInterest01 {
    private static SimpleInterest01 simpleInterest;

    public SimpleInterest01() {
    }
    //获取实例
    public static SimpleInterest01 getSimpleInterest() {
        if (null == simpleInterest){
            simpleInterest = new SimpleInterest01();
        }
        return simpleInterest;
    }
}

懒汉变种

  • 优点:只有在调用 getSimpleInterest() 时才会创建实例,节省资源,线程安全
  • 缺点:因为加了 synchronized 锁机制,初始化会变得更重,时间更长,且效率低
/**
 * 懒汉变种(线程安全)
 *
 * @author ext.liuyan10
 * @date 2021/2/5 9:28
 */
public class SimpleInterest02 {
    private static SimpleInterest02 simpleInterest;

    public SimpleInterest02() {
    }

    public static synchronized SimpleInterest02 getSimpleInterest() {
        if (null == simpleInterest){
            simpleInterest = new SimpleInterest02();
        }
        return simpleInterest;
    }
}

饿汉

  • 优点:通过类加载器(ClassLoader)创建实例,有效避免了线程安全问题
  • 缺点:项目启动的时间会变得更长
/**
 * 饿汉
 * @author ext.liuyan10
 * @date 2021/2/5 9:39
 */
public class SimpleInterest03 {
    private static SimpleInterest03 simpleInterest = new SimpleInterest03();

    public SimpleInterest03() {
    }

    public static SimpleInterest03 getSimpleInterest() {
        return simpleInterest;
    }
}

恶汉变种

  • 与恶汉只是写法不一样,优缺点也一样
/**
 * 恶汉变种
 *
 * @author ext.liuyan10
 * @date 2021/2/5 11:20
 */
public class SimpleInterest04 {
    public static SimpleInterest04 simpleInterest = null;
    static {
        simpleInterest = new SimpleInterest04();
    }

    public SimpleInterest04() {
    }

    public static SimpleInterest04 getSimpleInterest() {
        return simpleInterest;
    }
}

双重检验锁

  • 优点:只有在调用 getSimpleInterest() 时才会创建实例,节省资源,线程安全
  • 缺点:因为 synchronized 锁机制,使得效率低,代码臃肿
  • 总结:初始化个类写一堆,看着就烦,没见人写过
/**
 * 双重检验锁
 *
 * @author ext.liuyan10
 * @date 2021/2/5 11:26
 */
public class SimpleInterest05 {
    private volatile static SimpleInterest05 simpleInterest;

    public SimpleInterest05() {
    }

    public static SimpleInterest05 getSimpleInterest() {
        if (null == simpleInterest){
            synchronized (SimpleInterest05.class){
                if (null == simpleInterest){
                    simpleInterest = new SimpleInterest05();
                }
            }
        }
        return simpleInterest;
    }
}

静态内部类

  • 优点:通过类加载器(ClassLoader)创建实例,线程安全,但只有在调用getInterest() 时 内部类才会被调用,才会创建实例
  • 缺点:因在调用时才初始化实例,所有第一次初始时间略长
/**
 * 静态内部类
 *
 * @author ext.liuyan10
 * @date 2021/2/5 11:49
 */
public class SimpleInterest06 {
    private static class SimpleInterest {
        private static final SimpleInterest06 simpleInterest = new SimpleInterest06();
    }

    public SimpleInterest06() {
    }

    public static final SimpleInterest06 getInterest() {
        return SimpleInterest.simpleInterest;
    }
}

枚举

  • 优点:安全系数比较高,能有效防止Java反射
  • 缺点:写法比较奇特,很少有人写
/**
 * 枚举
 *
 * @author ext.liuyan10
 * @date 2021/2/5 11:53
 */
public enum SimpleInterest07 {
    INTEREST;

    public void getInterest() {

    }
}

相关文章

网友评论

      本文标题:Java 单例模式

      本文链接:https://www.haomeiwen.com/subject/glboahtx.html