Java之设计模式(一): 单例模式

2023-05-16

单例模式

    • 什么是单例模式?
    • 单例模式应用场景
    • 饿汉式
    • 懒汉式
    • 静态内部类
    • 总结

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

什么是单例模式?

单例保证一个对象JVM中只能有一个实例,常见单例 懒汉式、饿汉式

单例模式应用场景

1、在Spring中创建的Bean实例默认都是单例模式存在的。
2、数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗

饿汉式

优点
1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快
缺点
资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化
示例代码:

public class Singleton1 {
	//当class文件被加载的时候,就初始化对象,所以只有一个实例对象
	private static Singleton1 singleton = new Singleton1();
	private Singleton1() {
	}
	public static Singleton1 getSingleton() {
		return singleton;
	}
}

测试:

class SingletonTest1 {
	public static void main(String[] args) {
		Singleton1 sl1 = Singleton1.getSingleton();
		Singleton1 sl2 = Singleton1.getSingleton();
		System.out.println(sl1 == sl2);
		//输出 true
	}
}

懒汉式

什么是懒汉式,就是需要的才会去实例化,线程不安全。

第一种写法:
优点:
资源利用率高,不执行getInstance()就不会被实例,
缺点:
懒汉式在单个线程中没有问题,但多个线程同事访问的时候就可能同时创建多个实例,而且这多个实例不是同一个对象,

public class Singleton {
	// 当需要的才会被实例化
	private static Singleton singleton;
	private Singleton() {
	}
	synchronized public static Singleton getSingleton() {
		if (singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}

第二种写法:
优点
资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法
缺点
第一次加载时反应不快,由于java内存模型一些原因偶尔失败

public class Singleton {
	// 当需要的才会被实例化
	private static Singleton singleton;
	private Singleton() {
	}
	public static Singleton getSingleton() {
	     // 第一步检验锁
		if (singleton == null) { 
			// 第二步检验锁
			synchronized (Singleton.class) {  
				if (singleton == null) {
					singleton = new Singleton();
				}
			}
		}
		//当singleton 不为null的时候,就不用考虑线程安全问题
		return singleton;
	}
}

静态内部类

优点
资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法
缺点
第一次加载时反应不够快

class Test {
        private Test() {
        }

        private static class SingletonHelp {
                static Test instance = new Test();
        }

        public static Test getInstance() {
                return SingletonHelp.instance;
        }
}

总结

一般采用饿汉式,若对资源十分在意可以采用静态内部类,不建议采用懒汉式及双重检测

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java之设计模式(一): 单例模式 的相关文章

随机推荐

  • Kubuntu 安装fcitx 5

    kubuntu 22 04 安装fcitx5 一 安装前 xff1a 更新软件源 xff0c 不然下载会随缘中断 找到这个文件夹 etc apt 修改sources list 将所有的 http cn archive ubuntu com
  • 在学习opencv 多通道变单通道时 自己出现的一点错误

    include 34 stdafx h 34 include 34 highgui h 34 include 34 cv h 34 int main IplImage str1 str2 str3 str1 61 cvLoadImage 3
  • 计蒜客-1189-树根

    数根可以通过把一个数的各个位上的数字加起来得到 如果得到的数是一位数 xff0c 那么这个数就是数根 如果结果是两位数或者包括更多位的数字 xff0c 那么再把这些数字加起来 如此进行下去 xff0c 直到得到是一位数为止 比如 xff0c
  • HTTP——CDN简单认识

    贴一个B站地址 Up主讲的不错 以下内容是个人整理 CDN CDN Content Delivery Network 内容分发网络 CDN的必要性 服务器 包括云服务器 一定有一个物理位置 访问服务器的客户端如果距离服务器太远 或者服务器附
  • twitter闪退解决办法_那么我们如何解决Twitter? 用户界面改造将是一个不错的起点。...

    twitter闪退解决办法 by Daryll Santos 达里尔 桑托斯 Daryll Santos 那么我们如何解决Twitter xff1f 用户界面改造将是一个不错的起点 So how do we fix Twitter A us
  • MySQL分组查询,获取分组后数据

    MySQL分组查询 xff0c 获取分组后数据 MySQL分组查询 xff0c 将其它列的数据 xff0c 合并到一行展示 xff0c 可以设置去重 xff0c 设置去重 xff0c 设置排序 xff0c 截取指定条数 创建表结构 CREA
  • 解决的问题记录(持续更新)

    1 Ubuntu Server2020 4 树莓派WiringPi的安装与编译 链接 http i lckiss com p span class token operator 61 span span class token number
  • Microsoft Edge浏览器文件保存位置记录

    现在流行的Windows 10操作系统基本上都是使用Edge浏览器了 xff0c 作为一个重要的在线下载工具 xff0c 我得知道他把我下载的文件保存到什么地方去了 下面就记录下这两天观察到的 1 要是直接点击下载 xff0c 另存为xxx
  • python--排错--AttributeError: 'str' object has no attribute 'decode',关于python3的字符串

    AttributeError 39 str 39 object has no attribute 39 decode 39 一般是因为str的类型本身不是bytes xff0c 所以不能解码 两个概念 普通str xff1a 可理解的语义
  • Java向高级进阶(Java开发1-3年的仔看过来)

    遇到技术瓶颈 xff1f 在开发过程你是否觉得自己很多想法可是很难实现 xff1f 就算能实现但是实现的过程却很low xff1f 感觉自己开发几年一直在面向需求开发 xff0c 说好的面向对象开发呢 xff1f xff1f xff1f x
  • vue项目引用图标font-awesome提示错误

    vue引入font awesome图标样式一直报错 如图 xff1a 提示安装 xff1a npm install save font awesome scss font awesom 可以是安装之后还是报错 原来搞错顺序了 xff0c 要
  • IDEA 自动生成类注释和方法注释 (超舒服,超详细篇)

    目录 生成类注释生成类注释模板 生成方法注释生成方法注释模板方式注释的使用 很舒服的 xff0c 很详细的教程步骤 生成类注释 File gt Settings PreferencesEditor gt File and Code Temp
  • springboot项目解决扛住瞬间千次重复提交问题

    前言 在实际的开发项目中 一个对外暴露的接口往往会面临很多次请求 xff0c 我们来解释一下幂等的概念 xff1a 任意多次执行所产生的影响均与一次执行的影响相同 按照这个含义 xff0c 最终的含义就是 对数据库的影响只能是一次性的 xf
  • spring-boot mybatis-plus集成 代码自动生成 和 自定义生成代码 (简单,方便 易理解)

    mybatis plus自定义生成代码 导包在yml配置mybaits plus创建CodeGeneration java类测试看效果图 前言 xff1a 之前都是通过配置generatorConfig xml文件实现自动生成代码 xff0
  • 多线程之间如何实现通信,基础版(示例说明)

    多线程之间如何实现通信 什么是多线程之间通讯 xff1f 多线程之间通讯需求代码实现基本实现 什么是多线程之间通讯 xff1f 多线程之间通讯 xff0c 其实就是多个线程在操作同一个资源 xff0c 但是操作的动作不同 多线程之间通讯需求
  • 简单总结ConcurrentHashMap

    ConcurrentHashMap的概念 哈希算法 xff08 hash algorithm xff09 xff1a 是一种将任意内容的输入转换成相同长度输出的加密方式 xff0c 其输出被称为哈希值 HashMap与HashTable 因
  • openstack负载均衡_使用OpenStack Trove和Manila扩展DBaaS工作负载

    openstack负载均衡 稳定的数据库是任何企业应用程序中最常需要的组件之一 xff0c 而OpenStack背后的开发社区正在努力确保在开源云中使用数据库是一种简单 xff0c 可靠和高效的体验 Tesora的Amrith Kumar
  • 线程池原理分析(附线程池原理图)

    目录 什么是线程池使用线程池的好处线程池的作用线程池创建的四种方式重点介绍newFixedThreadPool线程池 线程池原理解析合理配置线程池大小 线程池就是这么简单 什么是线程池 线程池其实就是将多个线程对象放到一个容器当中 使用线程
  • Java反射机制,通过反射机制手写一个spring ioc框架

    Java基础 xff1a 反射机制 什么是反射Java反射机制的作用Java反射机制如何禁止Java反射机制的应用Java反射机制 常用 Api通过反射机制手写 spring ioc 示例 什么是SpringIOC什么是SpringIOC底
  • Java之设计模式(一): 单例模式

    单例模式 什么是单例模式 xff1f 单例模式应用场景饿汉式懒汉式静态内部类总结 设计模式 xff08 Design pattern xff09 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代