单例模式是一种常见的设计模式,确保一个类只有一个实例,并提供一个全局访问点。

embedded/2024/10/25 2:07:01/

单例模式

单例模式是一种常见的设计模式,确保一个类只有一个实例,并提供一个全局访问点。下面是单例模式的几种实现方式,包括线程安全的实现和延迟加载。

1. 懒汉式单例(线程不安全)

这种方式在第一次调用 getInstance() 方法时才创建实例,但在多线程环境下不是线程安全的。

在public class Singleton {private static Singleton instance;// 私有构造函数,防止外部创建实例private Singleton() {}// 提供一个全局访问点public static Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 非线程安全}return instance;}
}

2. 懒汉式单例(线程安全)

使用 synchronized 关键字来保证线程安全,但每次调用 getInstance() 都会加锁,性能较低。

public class Singleton {private static Singleton instance;// 私有构造函数,防止外部创建实例private Singleton() {}// 提供一个全局访问点public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 线程安全}return instance;}
}

3. 饿汉式单例

在类加载时就创建实例,因此线程安全,但不支持延迟加载。

public class Singleton {private static final Singleton instance = new Singleton();// 私有构造函数,防止外部创建实例private Singleton() {}public static Singleton getInstance() {return instance; // 线程安全}
}

4. 双重检查锁定(推荐)

这种方式结合了懒汉式和饿汉式的优点,在保证线程安全的同时提高性能。

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;}
}

5. 静态内部类单例

利用 Java 的类加载机制来实现延迟加载和线程安全。

public class Singleton {// 私有构造函数,防止外部创建实例private Singleton() {}// 静态内部类,只有在调用 getInstance() 时才会加载private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}// 提供一个全局访问点public static Singleton getInstance() {return SingletonHolder.INSTANCE; // 线程安全且延迟加载}
}
单例模式(Singleton Pattern)是一种常见的设计模式,确保某个类在应用程序中只有一个实例,并且提供全局访问点。单例模式列出常用于以下场景:
  1. 数据库连接池
    应用场景: 数据库连接池需要管理有限的数据库连接。为了避免每次数据库操作都创建和销毁连接,可以使用单例模式来确保连接池对象在应用程序中只有一个实例。
    示例: 连接池管理类通常是一个单例,多个数据库操作共享同一个连接池实例,避免资源浪费。
  2. 日志记录器(Logger)
    应用场景: 在大型应用中,日志记录是一项非常重要的工作。日志类通常是单例模式,因为日志记录是跨多个模块共享的,确保日志文件在整个应用中只有一个实例。
    示例: 日志管理器类只需要一个实例,所有模块或线程都通过该实例记录日志,避免多次创建日志文件句柄。
  3. 配置管理(Configuration)
    应用场景: 配置文件(如应用的全局设置、数据库配置等)通常是全局共享的。在应用启动时,加载配置文件后,整个应用会使用同一个配置实例。
    示例: 配置管理类通常是单例,用来读取和维护配置项的状态,确保所有模块获取到的配置是一致的。
  4. 线程池(ThreadPool)
    应用场景: 线程池用于管理应用中多个线程的创建、销毁和复用。由于线程池管理的是有限的资源,采用单例模式可以确保线程池在应用程序中只有一个实例。
    示例: 线程池类通常是单例,确保所有线程的管理都集中在一个地方,避免多个线程池实例的资源浪费。
  5. 缓存(Cache)
    应用场景: 缓存通常用于存储频繁访问的数据,以提高性能。全局缓存实例可以确保所有模块都可以共享缓存的数据,避免每次访问时重新创建缓存。
    示例: 缓存管理类作为单例存在,维护缓存数据的存取,确保一致性和高效性。

http://www.ppmy.cn/embedded/132209.html

相关文章

Spring Boot环境下的大创项目质量保证系统

3系统分析 3.1可行性分析 通过对本大创管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大创管理系统采用SSM框架,JAVA作为开发语言&#…

路由器ip地址是什么意思?路由器ip地址哪里看

在数字化时代,路由器作为连接互联网的重要设备,扮演着举足轻重的角色。然而,对于非技术背景的普通用户来说,路由器的一些专业术语和设置可能显得颇为神秘。其中,“路由器IP地址”就是一个常见但又容易让人困惑的概念。…

携程线下一面,面试内容:

面试时间:2024/9/12 • 实例方法和静态方法有什么不一样? • Java中的异常有哪几类?分别怎么使用? • 常用的集合类有哪些?比如List如何排序? • ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和各自适应的场景是什么? • 内存溢出是怎么…

2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析

目录 一、单选题 二、判断题 三、编程题 一、单选题 1、以下表达式的值为True的是?( ) A. all( ,1,2,3) B. any([]) C. bool(abc) D. divmod(6,0) 正确答案:C 答案解析:A和B选项,False;…

使用milvus数据库实现文本相似比较

先部署milvus, 使用单机模式模式 milvus-install.yaml --- apiVersion: v1 kind: PersistentVolume metadata:annotations:pv.kubernetes.io/bound-by-controller: "yes"finalizers:- kubernetes.io/pv-protectionmanagedFields:- apiVersion: v1fieldsType: Fiel…

Redis 性能优化选择:Pika 的配置与使用详解

引言 在我们日常开发中 redis是我们开发业务场景中不可缺少的部分。Redis 凭借其内存存储和快速响应的特点,广泛应用于缓存、消息队列等各种业务场景。然而,随着数据量的不断增长,单节点的 Redis 因为内存限制和并发能力的局限,逐…

【C++指南】运算符重载详解

引言 C 提供了运算符重载这一特性,允许程序员为自定义类型(如类和结构体)定义运算符的行为。 通过运算符重载,可以使自定义类型对象像内置类型一样使用运算符,从而提高代码的可读性和易用性。 本文将详细介绍 C 中运算…

什么是 Robots.txt 文件 重要性、作用和对 SEO 的影响

Robots.txt 文件是一个简单的文本文件,它指示网络爬虫网站的哪些内容可以索引,哪些内容不应该索引。Robots.txt 文件位于网站的根目录中,指导搜索引擎爬虫索引哪些内容,忽略哪些内容。它在塑造网站在搜索结果中的存在方面起着至关…