设计模式学习笔记(一)之单例模式

2023-11-19

单例模式

  • 作用:保证一个类只有一个实例,并且提供访问这个实例的全局访问点

  • 应用场景有:

    • 数据库连接池
    • spring中,Bean默认是单例
    • Servlet中,每一个Servlet是单例
    • 配置文件的类,一般是单例
  • 优点:

    • 单例只生成一个实例,减少系统的开销
    • 可以设置系统的全局访问点,优化共享资源的访问
  • 实现方式:

    • 饿汉式----线程安全,调用率效率高,不能延时加载

      public class Singleton {
          private static final Singleton instance = new Singleton();
      
          /**
           * 如果只是加载这个类,不调用getInstance(),会造成资源浪费
           */
          private Singleton() {
          }
      
          /**
           * static变量会在类装载时初始化,
           * 不会涉及多个线程对象访问该对象的问题。
           * 虚拟机保证只会装载一次该类,一定不会发生并发访问的问题。
           * 所以,可以省略synchronized关键字
           *
           * @return
           */
          public static synchronized Singleton getInstance() {
              return instance;
          }
      }
      
      
    • 懒汉式----线程安全,调用效率不高,能够延时加载

      public class Singleton {
          private static Singleton instance;
      
          /**
           * 每次调用getInstance()都要同步,并发效率低
           */
          private Singleton() {
          }
      
          /**
           * 延迟加载,用的时候才会加载
           *
           * @return
           */
          public static synchronized Singleton getInstance() {
              if (null == instance) {
                  instance = new Singleton();
              }
              return instance;
          }
      }
      
      
    • 双重检测锁式

      public class Singleton {
          private static Singleton instance = null;
      
          private Singleton() {
          }
      
          public static Singleton getInstance() {
              if (null == instance) {
                  Singleton singleton;
                  synchronized (Singleton.class) {
                      singleton = instance;
                      if (null == singleton) {
                          synchronized (Singleton.class) {
                              if (null == singleton) {
                                  singleton = new Singleton();
                              }
                          }
                          instance = singleton;
                      }
                  }
              }
              return instance;
          }
      }
      
      
    • 静态内部类式----线程安全,调用效率高,可以延时加载

      public class Singleton {
          /**
           * 只有调用getInstance(),才会加载静态内部类。加载类时是线程安全的。
           * instance是static final类型,保证内存中只有这样一个实例,
           * 并且只能被赋值一次,保证了线程安全性.
           * 具有并发高效调用和延迟加载的优势
           */
          private Singleton() {
          }
      
          private static class SingletonClass {
              private static final Singleton instance = new Singleton();
          }
      
          /**
           * 外部类没有static属性,不会像饿汉式一样立即加载对象
           *
           * @return
           */
          public static Singleton getInstance() {
              return SingletonClass.instance;
          }
      
      
      }
      
      
    • 枚举----线程安全,调用效率高,不能延时加载

      public enum Singleton {
          /**
           * 一个枚举的元素,它代表Singleton的一个实例
           */
          INSTANCE;
      
          public void singleton() {
      
          }
      
      }
      
      
  • 使用场景

    • 单例对象占用资源少,不需要延时加载
      • 枚举 > 饿汉式
    • 单例对象占用资源大,需要延时加载
      • 静态内部类 > 懒汉式
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式学习笔记(一)之单例模式 的相关文章

  • MATLAB实现CNN-LSTM卷积长短期记忆神经网络数据分类预测

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 一种基于长短时记忆网络和卷积神经网络的文本分类方法 首先 利用词向量将输入文本进行向

随机推荐

  • Win7 64位操作系统连接HP 1010打印机完美解决方案

    工作的第一天就遇到问题 新电脑无法连接老式的HP1010打印机 64位Windows7系统无法连接32位XP网络共享打印机 而32位WIN7就可以 这里分享个简单的解决方法 先去下载一个64位的打印机驱动 然后添加打印机 注意这里要添加的是
  • SQL---DML---ORDER BY排序检索子句的几种方式

    关系数据库设计理论认为 如果不明确规定排序顺序 则不应该假定检索出的数据的顺序有意义 为了明确地排序用SELECT语句检索出来的数据 可使用ORDER BY子句 排序一列数据 SELECT 列名1 FROM 表名 ORDER BY 列名2
  • 【2022年MathorCup大数据竞赛】B题:北京移动用户体验影响因素研究(四)(问题一的千余行代码整理)

    目录 代码整理 一 问题一附件1语音业务数据集处理代码 二 问题一附件2上网业务数据集处理代码 一 问题一附件1语音业务数据集处理代码 问题一附件1语音业务数据集处理代码 import numpy as np import pandas a
  • 打包前后端项目并部署至服务器

    1 打包前端项目 打包命令 npm run build 执行完命令后 会生成一个名为 dist 的文件夹 这个就是打包好的前端项目 2 打包后端项目 2 1 执行 maven 的 clean 删除项目编译创建的 target 文件夹 2 2
  • fastcgi 模块各个常用变量的意义

    nginx fasrcgi 模块的文档 http nginx org en docs http ngx http fastcgi module html fastcgi pass 设置FastCGI服务器的地址 将匹配到该location的
  • C语言程序的结构

    1 C语言程序主要由函数构成 函数是C语言程序的基本单位 一个C语言源程序必须有一个main函数 可以包含一个main函数和若干个其他函数 主函数可以调用其他函数 其他函数之间可以互相调用 但其他函数不能调用主函数 被调用的函数可以是系统提
  • 时序算法研究系列之Prophet安装(准备篇)

    前言 新开一个关于时序数据预测算法的系列博客 计划整理目前的时序数列的预测方法 原理 应用 心得等 其中Prophet因为在安装时候踩了很多雷 所以专门开一个准备篇写安装过程 下一篇讲述具体应用 目录 前言 Prophet 简介 方法一 方
  • 查看字节码

    1 安装插件 ASM Bytecode outline 与hexview 2 查看字节码 源码 package com asm public class HelloWorld public static void main System o
  • 【华为OD机试真题 JAVA】求最多可以派出多少支团队

    JS版 华为OD机试真题 JS 求最多可以派出多少支团队 标题 求最多可以派出多少支团队 时间限制 1秒 内存限制 262144K 语言限制 不限 用数组代表每个人的能力 一个比赛活动要求参赛团队的最低能力值为N 每个团队可以由1人或2人组
  • Eclipse插件之Bytecode Outline

    本文介绍如何利用Eclipse插件Bytecode Outline在Eclipse中的操作使用 Eclipse是目前非常流行的开发平台 开放扩展的架构让很多程序员找到了自己个性化的工作环境 Bytecode Outline 插件可以把当前的
  • U盘安装ubuntu16.04及IP配置,硬盘挂载。

    U盘安装ubuntu16 04及IP配置 硬盘挂载 准备一个启动盘 进入BIOS 安装系统 设置静态ip 挂载硬盘脚本 安装基本包 准备一个启动盘 准备一个U盘 可以用 ultraiso 工具来制作 进入BIOS 将U盘插入要安装的电脑 开
  • 理解gateway网关,及与前端联调过程

    1 一些概念 客户端向Spring Cloud Gateway发出请求 然后在Gateway Handler Mapping中找到请求相匹配的路由 将其发送到Gateway Web Handler Handler再通过制定的过滤器链来将请求
  • NeRF神经辐射场中关于光线从世界坐标系转换为NDC坐标系 Representing Scenes as Neural Radiance Fields for View Synthesis

    本文旨在回复一个粉丝的关于坐标系变换编程提问 并结合下面的一个代码进行解释 完整代码参考我前面的文章 补充 希望那个同学可以看见 因为公众号对话10天未互动默认无法再回复消息了 def get ndc rays H W focal near
  • 两层及N层全连接神经网络模型原理

    两层及N层全连接神经网络模型原理 前言 1 两层MLP 1 1 前向传播 1 2 反向传播 2 N层MLP 2 1 网络参数 2 2 超参数优化 3 MLP优化 前言 深度学习是学习样本数据的内在规律和表示层次 在学习过程中获得的信息对诸如
  • 蓝桥杯最长不下降子序列,线段树python

    问题描述 给定一个长度为 N 的整数序列 A1 A2 AN 现在你有一次机会 将其 中连续的K 个数修改成任意一个相同值 请你计算如何修改可以使修改后的数 列的最长不下降子序列最长 请输出这个最长的长度 最长不下降子序列是指序列中的一个子序
  • 1+x 证书 Web 前端开发中级理论考试(试卷 6 )

    1 x 证书 Web 前端开发中级理论考试 试卷 6 官方QQ群 1 x 证书 web 前端开发初级对应课程分析 http blog zh66 club index php archives 194 1 X 证书 Web 前端开发中级对应课
  • 2022国赛5:神州路由器DHCP服务配置

    配置如下 RA配置 Router conf Router host RA RA config int g0 1 RA config g0 1 ip add 192 168 10 1 255 255 255 0 RA config g0 1
  • STM32+ESP8266+MQTT连接阿里云(1)

    ESP8266连接阿里云的流程 发送 目的是让ESP8266退出透传 AT RESTORE 让模块恢复出厂设置 AT 判断模块的好坏及工作状态 正常就会回复OK ATE0 关闭回显 这个没什么好说的 AT CWMODE CUR 1 设置为s
  • 【网络是怎样连接的】—— 向 DNS 服务器查询 IP 地址

    IP 1 基本知识 互联网和公司内部的局域网都是基于 TCP IP 的思路来设计的 由一些小的子网 通过路由器连接起来组成一个大的网络 这里的子网可以理解为用集线器连接起来的几台计算机 在网络中 所有的设备都会被分配一个地址 这个地址就相当
  • 设计模式学习笔记(一)之单例模式

    单例模式 作用 保证一个类只有一个实例 并且提供访问这个实例的全局访问点 应用场景有 数据库连接池 spring中 Bean默认是单例 Servlet中 每一个Servlet是单例 配置文件的类 一般是单例 优点 单例只生成一个实例 减少系