单例模式

矫情吗;* 2021-11-22 10:52 431阅读 0赞







    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

/*

  @author BubbleTg

  <p>

  单例模式模板01

  饿汉式单例模式

  一开始就线程安全。

 */

public class SingletonPatternDemo01 {

 

    //初始化时立即加载

    private static SingletonPatternDemo01 instance = new SingletonPatternDemo01();

 

    //构造器私有化

    private SingletonPatternDemo01() {

    }

 

    //返回,不需要同步,调用效率高

    public static SingletonPatternDemo01 getInstance() {

        return instance;

    }

 

 

}








    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

/*

  @author BubbleTg

  <p>

  单例模式模板01

  懒汉式单例模式

  延迟加载,真正用到的时候才加载。

  资源利用率高,但是由于需要同步,并发效率较低。

 /

public class SingletonPatternDemo02 {

    private static SingletonPatternDemo02 instance;

 

    //构造器私有化

    private SingletonPatternDemo02() {

    }

 

    //同步,调用效率低

    public static synchronized SingletonPatternDemo02 getInstance() {

        if (instance == null) {

            instance = new SingletonPatternDemo02();

        }

        return instance;

    }

 

 

}

 

 

 

必须知道线程同步问题!!!








    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

   27

   28

   29

   30

   31

   32

   33

   34

   35

   36

/*

  @author BubbleTg

  <p>

  单例模式模板03

  双重实现锁实现单例模式

  <p>

  此种会出现的问题

  因为编译器的优化原因和JVM底层内部模型原因,偶尔会出问题,不建议使用。

 */

public class SingletonPatternDemo03 {

    private static SingletonPatternDemo03 instance = null;

 

    //构造器私有化

    private SingletonPatternDemo03() {

    }

 

 

    public static SingletonPatternDemo03 getInstance() {

        if (instance == null) {

            SingletonPatternDemo03 sp;

            synchronized (SingletonPatternDemo03.class) {

                sp = instance;

                if (sp == null) {

                    synchronized (SingletonPatternDemo03.class) {

                        if (sp == null) {

                            sp = new SingletonPatternDemo03();

                        }

                    }

                    instance = sp;

                }

 

            }

        }

        return instance;

    }

}








    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

/*

  @author BubbleTg

  <p>

  单例模式模板04

  静态内部类实现单例模式

  <p>

  也是一种懒加载,兼备了并发高效和延迟加载的优势!

 /

public class SingletonPatternDemo04 {

 

    private  static class SingletonPatternInstance {

        private static final SingletonPatternDemo04 instance = new SingletonPatternDemo04();

    }

 

    //构造器私有化

    private SingletonPatternDemo04() {

    }

 

    //方法没有同步,调用效率高!

    public static SingletonPatternDemo04 getInstance() {

        return SingletonPatternInstance.instance;

    }

}








    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

/*

  @author BubbleTg

  <p>

  单例模式模板05

  枚举实现单例模式

  <p>

  缺点:没有延迟加载

  优点:

  线程安全,调用效率高,天然防止反射和反序列化漏洞!

 /

public enum  SingletonPatternDemo05 {

 

    //这个枚举元素,本身就是单例

    INSTANCE;

 

    //添加自己需要的操作

    public void singletonOperation(){

    }

}

-常见的五种单例模式实现方式

-主要:

-饿汉式(线程安全,调用效率高。但是,不能延时加载。)

•懒汉式(线程安全,调用效率不高。但是,可以延时加载。)

-其他:

•双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)

•静态内部类式(线程安全,调用效率高。但是,可以延时加载)

•枚举式(线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列 化漏洞!)

•如何选用?

-单例对象占用资源少,不需要延时加载:

•枚举式好于饿汉式

-单例对象占用资源大,需要延时加载:

•静态内部类式 好于 懒汉式

发表评论

表情:
评论列表 (有 0 条评论,431人围观)

还没有评论,来说两句吧...

相关阅读

    相关 模式

    简介: 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在

    相关 模式

    单例模式 单例模式(SingletonPattern)是java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及

    相关 模式

    1、懒汉式,线程不安全 是否 Lazy 初始化:是 是否多线程安全:否 实现难度:易 描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有

    相关 模式

    应用场景 1. windows的任务管理器 2. 网站的计数器 3. 应用程序的日志 4. 数据库连接池,因为数据库连接是一种数据库资源。数据库软件系统中使用数据

    相关 模式

    1.定义          单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 2.实现步骤 1. 将该类的构造方法定义为私有方法,这样其他处

    相关 模式

    单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责