java设计模式 单例模式

单例模式

什么是单例模式

单例模式(Singleton Pattern)是一种设计模式,目的是确保一个类在整个程序中只有一个实例,并提供一个全局的访问点来获取该实例。它常用于需要频繁访问某个对象的场景,且该对象在整个程序运行过程中只需一个实例时。

单例模式的用途

单例模式的主要用途包括:

控制资源共享:在许多应用场景下,某个类的实例可能是资源密集型的或占用大量内存的,单例模式确保只有一个实例存在,避免了不必要的资源浪费。
全局访问点:它为应用程序中的某些全局状态提供了一个访问点,例如,数据库连接池、日志管理器、配置管理等。
跨多个组件共享数据或状态:通过单例模式,所有组件可以访问到相同的实例,确保数据一致性和共享状态。
避免重复创建:对于一些创建成本较高的对象,可以确保只创建一次并重复使用,降低了程序的开销。

单例模式的写法

饿汉式

饿汉式是类加载时就创建实例,不论是否使用,通常适用于实例化过程简单且没有线程安全问题的情况。

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}  // 私有构造函数,防止外部创建实例

    public static Singleton getInstance() {
        return instance;
    }
}


懒汉式

懒汉式是在第一次使用时才创建实例,延迟加载,但它的缺点是线程不安全,在多线程环境中可能会出问题。
例如多个线程获取这个单例对象的时候会先执行static静态方法,当多个线程同时进入getInstance方法因为没加锁,所以可能创建多个Singleton对象

public class Singleton {
    private static Singleton instance;

    private Singleton() {}  // 私有构造函数,防止外部创建实例

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

线程安全的懒汉式

通过加锁确保线程安全。虽然可以解决多线程问题,但由于每次获取实例时都要进行同步,可能会导致性能瓶颈。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}  // 私有构造函数,防止外部创建实例

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双重检验锁

双重检查锁定是懒汉式的优化版本,只有第一次创建实例时加锁,后续访问时不再加锁,避免了性能问题。

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}  // 私有构造函数,防止外部创建实例

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

静态内部类

静态内部类是线程安全的懒加载方式,它利用 Java 类加载机制确保线程安全,并且延迟加载

public class Singleton {
    private Singleton() {}  // 私有构造函数,防止外部创建实例

    private static class SingletonHelper {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHelper.INSTANCE;
    }
}

解释:

SingletonHelper 类是静态的,并且只会在 getInstance() 方法第一次调用时加载,因此确保了延迟加载和线程安全。
这种方式不仅线程安全,而且性能较高,是推荐的单例模式实现方法。

由于类加载的过程是线程安全的,JVM 会保证只会有一个线程加载类,并且保证初始化过程不会被多次执行。

单例模式的应用场景

单例模式的应用非常广泛,常见的地方包括:

数据库连接池:为了提高数据库连接的复用性,避免频繁创建和销毁数据库连接对象,数据库连接池通常会使用单例模式。

日志管理器:日志对象通常是单一的,不需要多个实例来记录日志,单例模式确保日志管理器在整个程序中只有一个实例。

配置管理:应用程序的配置通常是唯一的,使用单例模式来读取和管理配置文件,避免多次加载配置。

线程池管理:为了避免多次创建线程池,线程池管理对象通常使用单例模式来保证系统中只存在一个线程池实例。

缓存管理:许多应用需要使用缓存来提高性能,缓存对象可以使用单例模式,保证缓存数据一致性。

应用程序上下文(AppContext):有些框架或大型系统中,常用单例模式管理应用程序的上下文信息,如Spring框架中的应用上下文。

在我们使用的Springboot框架中,springboot中的注解例如@Controller @Service @Repository都是spring容器给我们管理创建的饿汉式单例对象

数据库连接池

在 Spring Boot 中,数据库连接池(如 HikariCP,默认的连接池)通过单例模式来管理的。在 application.yml 或 application.properties 文件中配置数据库连接池的属性时,Spring Boot 会将这些配置应用到数据库连接池的实例中。

Spring Boot 会在启动时初始化数据库连接池,并且通常会作为一个 单例 Bean 存在,避免了每次需要连接数据库时都重新创建连接池的开销。这个单例的数据库连接池会被应用程序的所有数据库操作共享,从而提高了数据库连接的复用性和效率。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver  # 这个通常是可以省略的,Spring Boot 会自动推断
    hikari:
      maximum-pool-size: 10  # 连接池配置

Spring Boot 会根据这些配置自动创建并初始化数据库连接池,并将其作为单例 Bean 注入到 Spring 容器中。

日志配置

在 Spring Boot 中,日志对象(如 Logger)是通过 LoggerFactory 来创建的,且通常是单例的。日志管理器是一个典型的应用场景,其中日志对象不需要多个实例,因此使用单例模式来确保在整个应用程序中只有一个实例。

配置管理类

Spring Boot 会根据配置文件中的内容自动创建一个配置类,加载配置并将其作为一个单例 Bean 提供给应用程序。
在 Spring Boot 启动时,DataSourceConfig 会作为一个单例 Bean 被加载,并且能够共享整个应用的数据库配置。

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {
    private String url;
    private String username;
    private String password;
    // getters and setters
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949638.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全测评技术与标准

18.1 概况 1)概念 :指参照一定的标准规范要求,通过一系列的技术和管理方法,获取评估对象的网络安全状况信息,对其给出相应的网络安全情况综合判定。 网络安全测评对象通常包括信息系统的组成要素或信息系统自身。 2…

5个不同类型的mysql数据库安装

各种社区版本下载官方地址:MySQL :: MySQL Community Downloads 一、在线YUM仓库(Linux) 选择 MySQL Yum Repository 选择对应版本下载仓库安装包(No thanks, just start my download.) 下载方法1:下载到本…

Lua开发环境如何安装?保姆级教程

大家好,我是袁庭新。Lua开发环境如何安装搭建?这套篇文章帮你搞定~ CentOS 7系统默认已经安装了Lua语言环境,因此可直接运行Lua代码。可以使用以下命令查看当前系统中默认自带的Lua版本。 # 查看系统默认自带的Lua版本 [rootloc…

Linux 系统搭建网络传输环境汇总

Ubuntu 系统搭建 TFTP 服务器 1. 创建 /home/username/workspace/tftp 目录并赋予最大权限,username 是自己用户名 sudo mkdir -p /home/username/workspace/tftp sudo chmod 777 /home/username/workspace/tftp 2. 安装 tftp-hpa( 客户端软件包&#x…

深度学习中CUDA环境安装教程

首先说明,本人是小白,一次安装,可能有不对的地方,望包含。 安装CUDA 因为我们是深度学习,很多时候要用到gpu进行训练,所以我们需要一种方式加快训练速度。 通俗地说,CUDA是一种协助“CPU任务分…

基于word2vec的推荐系统

基于word2vec的推荐系统 可用于推荐商品,图书,电影,课程,旅游景点,音乐… 效果 网址点我跳转 一、word2vec简介 Word2Vec是一种词向量表示方法,是在自然语言处理领域(NLP)的神经…

多目标优化算法——基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA)

基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA) 一、算法简介 简介: 现有的多目标进化算法(moea)在具有规则Pareto前沿且Pareto最优解在目标空间上连续分布的多目标优化问题(MOPs&#xff…

Kubernetes开发环境minikube | 开发部署apache tomcat web单节点应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署J2EE tomcat web应用 minikube start --force minikube status 如上所示,在Linux中启动minikube运行环境 service docker start docker version service docker …

【QT-QTableView实现鼠标悬浮(hover)行高亮显示+并设置表格样式】

1、自定义委托类 HoverDelegate hoverdelegate.h #ifndef HOVERDELEGATE_H #define HOVERDELEGATE_H#include <QObject> #include <QStyledItemDelegate>class hoverdelegate : public QStyledItemDelegate {Q_OBJECT // 添加 Q_OBJECT 宏public:explicit hoverde…

企业网络性能监控

什么是网络性能监控 网络性能监控&#xff08;NPM&#xff09;是指对计算机网络的性能进行持续测量、分析和管理的过程&#xff0c;通过监控流量、延迟、数据包丢失、带宽利用率和正常运行时间等关键指标&#xff0c;确保网络高效、安全地运行&#xff0c;并将停机时间降至最低…

引领AI发展潮流:打造大模型时代的安全与可信——CCF-CV企业交流会走进合合信息会议回顾

一、前言 随着数字化浪潮的推动&#xff0c;人工智能技术正在以前所未有的速度深刻改变着我们的生活、工作方式以及社会结构。AI技术的飞速发展不仅为各行业带来了前所未有的机遇&#xff0c;也同时引发了关于其风险与挑战的广泛关注。如何平衡技术进步与安全保障&#xff0c;…

List ---- 模拟实现LIST功能的发现

目录 listlist概念 list 中的迭代器list迭代器知识const迭代器写法list访问自定义类型 附录代码 list list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素…

Matlab回归预测大合集(不定期更新)-188

截至2025-1-2更新 1.BP神经网络多元回归预测&#xff08;多输入单输出&#xff09; 2.RBF神经网络多元回归预测&#xff08;多输入单输出&#xff09; 3.RF随机森林多元回归预测&#xff08;多输入单输出&#xff09; 4.CNN卷积神经网络多元回归预测&#xff08;多输入单输…

go语言zero框架中教务crm系统的在职继承和离职交接的设计与实践

在GoZero中实现一个在职继承和离职交接的通用模块&#xff0c;涉及到顾问离职交接客户、领导离职交接审批单据等功能。为了使这个模块通用且易于扩展&#xff0c;我们可以分成几个部分&#xff1a; 1. **数据模型设计**&#xff1a;我们首先需要设计离职交接相关的数据模型。 …

Mac软件介绍之录屏软件Filmage Screen

软件介绍 Filmage Screen 是一款专业的视频录制和编辑软件&#xff0c;适用于 Mac 系统 可以选择4k 60fps&#xff0c;可以选择录制电脑屏幕&#xff0c;摄像头录制&#xff0c;可以选择区域录制。同时也支持&#xff0c;简单的视频剪辑。 可以同时录制电脑麦克风声音 标准…

毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

对话|企业如何构建更完善的容器供应链安全防护体系

对话&#xff5c;企业如何构建更完善的容器供应链安全防护体系 云布道师 随着云计算和 DevOps 的兴起&#xff0c;容器技术和自动化成为软件开发中的必要手段&#xff0c;软件供应链也进入了自动化及 CI/CD 阶段。然而&#xff0c;容器技术和自动化虽然提升了软件的更新速度&…

小试牛刀-SpringBoot集成SOL链

目录 一、什么是solanaj? 二、Pom依赖 三、主要类 3.1 RpcClient 3.2 PublicKey 3.3 Transaction 3.4 TransactionInstruction 四、示例代码 Welcome to Code Blocks blog 本篇文章主要介绍了 [小试牛刀-SpringBoot集成SOL链] ❤博主广交技术好友&#xff0c;喜欢文章的…

LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库

一、必备条件&#xff1a; python语言Neo4j数据库python库&#xff1a;neo4j、llmsherpa、glob、dotenv 二、代码&#xff1a; from llmsherpa.readers import LayoutPDFReaderfrom neo4j import GraphDatabaseimport uuidimport hashlibimport osimport globfrom datetime …

牛客网刷题 ——C语言初阶(5操作符)——BC117 小乐乐走台阶

1.题目 &#xff1a;BC117 小乐乐走台阶 牛客OJ题链接 描述 小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选择走一阶或者走两阶&#xff0c;那么他一共有多少种走法&#xff1f; 输入描述&#xff1a; 输入包含一个整数n (1 ≤ n ≤ 30) …