当前位置: 首页 > news >正文

单例模式分享

单例模式是一种常见的设计模式,它确保某个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式在需要限制某个类只能有一个实例时非常有用,例如线程池、数据库连接池、日志记录器等。下面我将详细介绍单例模式的实现方式以及其优缺点。

实现方式

单例模式的实现有多种方式,其中比较常见的有以下几种:

1. 懒汉式(Lazy Initialization)

这种方式下,实例在第一次被使用时才会被创建。

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
2. 饿汉式(Eager Initialization)

这种方式下,实例在类加载的时候就会被创建。

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
3. 双重检查锁(Double-Checked Locking)

这种方式结合了懒汉式和线程安全。

public class Singleton {private volatile static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
4. 静态内部类

利用静态内部类的特性,可以实现延迟加载和线程安全。

public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}
5. 枚举

枚举是实现单例模式的最佳方式之一,它天生就是线程安全的,并且在序列化和反序列化时能保证单例的唯一性。

public enum Singleton {INSTANCE;
}

优点

  • 实例控制:确保只有一个实例存在,避免了多个实例导致资源浪费和不一致的情况。
  • 全局访问点:通过单例模式,可以提供一个全局的访问点来访问实例,方便统一管理。

缺点

  • 可能造成资源浪费:在某些情况下,单例模式可能会造成资源浪费,因为实例会在应用启动时被创建,即使可能在后续的运行过程中并没有被使用。
  • 可能导致性能问题:在多线程环境下,一些实现方式可能会因为加锁而导致性能问题。

注意事项

  • 线程安全:在多线程环境下,确保实现是线程安全的,避免出现竞态条件。
  • 序列化和反序列化:如果涉及到序列化和反序列化,要考虑如何保证单例的唯一性。
  • 防止反射攻击:可以通过在构造函数中添加逻辑来防止通过反射机制调用私有构造函数创建多个实例。

总的来说,单例模式是一种非常有用的设计模式,但在使用时需要根据具体情况选择合适的实现方式,并注意线程安全、序列化等问题。

相关文章:

  • 科技论文编写思路
  • 学习大数据,所必需的java基础(6)
  • leetcode刷题(剑指offer) 47.全排列Ⅱ
  • 微服务中排除父项目中的某个依赖
  • Web安全之接口鉴权
  • springboot/ssm工作量统计系统Java工作记录可视化管理系统web
  • Vue3+Element-Plus中ELMessage样式丢失处理
  • Stream流详解
  • CSAPP-信息的表示和处理
  • 【leetcode】链表的中间节点
  • 网络安全与代理技术:解密 SOCKS5、代理IP 和 HTTP
  • ubuntu常见配置
  • 通过jenkins进行部署java程序到centos上
  • 深入理解Nginx,腾讯T3大佬亲自讲解
  • Mockito入门和使用场景探究
  • (三)从jvm层面了解线程的启动和停止
  • [译]前端离线指南(上)
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【css3】浏览器内核及其兼容性
  • Codepen 每日精选(2018-3-25)
  • EventListener原理
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java 内存分配及垃圾回收机制初探
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Python利用正则抓取网页内容保存到本地
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 代理模式
  • 电商搜索引擎的架构设计和性能优化
  • 解析 Webpack中import、require、按需加载的执行过程
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何进阶一名有竞争力的程序员?
  • 三分钟教你同步 Visual Studio Code 设置
  • 树莓派 - 使用须知
  • 自动记录MySQL慢查询快照脚本
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (2.2w字)前端单元测试之Jest详解篇
  • (39)STM32——FLASH闪存
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (七)Knockout 创建自定义绑定
  • (三)mysql_MYSQL(三)
  • (十五)使用Nexus创建Maven私服
  • (一)基于IDEA的JAVA基础10
  • (转)Scala的“=”符号简介
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CLR基本术语
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)