单例模式详解

    1. 单例模式(Singleton)是设计模式中最常见、最简单的模式之一 ,属于构建/建造型模式

    2. 设计模式(design pattern):针对软件开发过程中的某一类问题形成的方案。到目前为止,在软件开发过程中,有上百种设计模式,其中比较常用的有24种

    3. 单例模式,顾名思义,指的是在全局只存在唯一的一个实例对象

    4. 单例模式有六种实现方式:饿汉式懒汉式、单重所、双重锁(DCL)、枚举式、内部类式

      1. 饿汉式

        public class A {
            // 在类中准备好一个对象,希望所有的使用者都只用准备号的唯一对象
            // 饿汉式:在定义对象的时候就初始化对象
            // 缺点:无论是否需要使用这个对象,在第一次调用这个类的时候都会初始化这个对象,从而增长了类的加载时间
            // 优点:没有线程的并发问题 - 类只加载一次,所以静态对象也只初始化一次
            private static final A a = new A();
            // 不允许在类外随便创建对象 - 构造函数私有化
            private A(){}
            public static A get(){return a;}
        }

      2. 懒汉式

        public class A {
            
            // 懒汉式:在定义对象的时候不初始化对象,而是在第一次调用方法的时候再初始化这个对象
            // 优点:在有需要的时候才会初始化对象,从而缩短了类的加载时间
            // 缺点:会产生线程的并发问题
            private static A a;
           
            private A(){}
            public static A get(){
                if(a == null) a = new A();
                return a;
            }
        }

      3. 单重锁

        public class A {
            
            private static A a;
           
            private A(){}
            public static A get(){
                // 优点:保证线程的并发安全
                // 缺点:锁本质上就是保证线程的"独占",因此加锁和解锁都需要消耗资源
                // 当对象被初始化之后,后续的所有的线程都需要先加锁,然后判断是否为空,再解锁,也就意味着所有的线程都需要经历锁的过程
                synchronized(A.class){
                    if(a == null) a = new A();
                }
                return a;
            }
        }

      4. 双重锁(DCL - Double Check Lock)

        public class A {
            
            private static A a;
           
            private A(){}
            public static A get(){
                if(a == null){
                    synchronized(A.class){
                        if(a == null){
                            synchronized(A.class){
                                a = new A();
                            }
                        }
                    }
                }
                return a;
            }
        }

      5. 枚举式

        enum A{
            a
        }

      6. 内部类式

        public class A {
            
            public static class AI{
                private static final AI instance = new AI();
            }
            
            public static AI getInstance(){
                return AI.instance;
            }
            
        }

相关推荐

  1. 模式详解

    2024-03-16 06:16:04       61 阅读
  2. 模式详解

    2024-03-16 06:16:04       45 阅读
  3. 模式详解

    2024-03-16 06:16:04       32 阅读
  4. 模式详解

    2024-03-16 06:16:04       23 阅读
  5. C++模式详解

    2024-03-16 06:16:04       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 06:16:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 06:16:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 06:16:04       82 阅读
  4. Python语言-面向对象

    2024-03-16 06:16:04       91 阅读

热门阅读

  1. springboot的自动配置原理

    2024-03-16 06:16:04       50 阅读
  2. apache和tomcat的优化总结概述

    2024-03-16 06:16:04       38 阅读
  3. 如何判断两个表的结构相同?desc t1 和desc t2

    2024-03-16 06:16:04       39 阅读
  4. SpringBoot3下Kafka分组均衡消费实现

    2024-03-16 06:16:04       43 阅读
  5. mysql 查询字段大于某长度的SQL

    2024-03-16 06:16:04       36 阅读
  6. Lua 学习

    2024-03-16 06:16:04       43 阅读