java 设计模式(三)-- 单例模式

引言

单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式在Java中实现起来相对简单,但实现方式有多种,每种方式都有其特点和适用场景。

一、单例模式的实现方式

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

这是最基本的单例实现方式,它在第一次调用getInstance()方法时才会创建实例。

public class Singleton {private static Singleton instance;// 私有化构造函数private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

这种方式的缺点是,如果多个线程同时访问getInstance()方法,可能会创建多个实例。

2. 懒汉式(线程安全):

通过在方法上加锁来保证线程安全。

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

但这种方式的缺点是,每次调用getInstance()方法时都需要同步,这会影响性能。

3. 饿汉式:

在类加载时就创建实例,避免了多线程同步问题。

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

这种方式简单,不存在多线程同步问题,但不管是否使用该实例,类装载时就完成实例化。

4. 双重检查锁定(Double-Checked Locking)推荐

结合了懒汉式和饿汉式的优点,既保证了线程安全,又避免了同步带来的性能问题

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

volatile关键字确保了多线程环境下instance变量的可见性。

5. 静态内部类:

静态内部类实现方式同样利用了类加载的机制来保证初始化instance时只有一个线程,同时利用了JVM的类加载机制来保证初始化instance时线程安全。

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

二、单例模式的应用场景

单例模式广泛应用于各种 Java 应用程序中,以下是一些典型的应用场景:

  • 日志记录器:通常系统中只需要一个日志记录器实例,用于集中管理日志信息。
  • 配置管理:应用程序的配置信息通常应该由单个实例管理,以确保配置的一致性。
  • 缓存:缓存数据的共享访问可以使用单例模式实现。
  • 线程池:线程池通常由单例管理,以控制线程的生命周期和资源分配。
  • 数据库连接池:数据库连接池也是典型的单例模式应用,用于管理数据库连接资源。
  • 对话框:GUI 应用程序中的对话框通常应该是单例的,以避免创建多个对话框实例。
  • 注册中心:服务注册中心通常使用单例模式来保证全局唯一性。

可以看到,单例模式是一种非常实用和广泛应用的设计模式。合理使用单例模式可以帮助我们更好地管理应用程序的资源和状态,提高程序的性能和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】从零开始认识进程间通信 —— 管道

送给大家一句话: 人要成长,必有原因,背后的努力与积累一定数倍于普通人。所以,关键还在于自己。 – 杨绛 从零开始认识进程间通信 1 为什么要进程间通信2 进程如何通信3 进程通信的常见方式4 管道4.1 什么是管道4.2 管道通信的系…

交叉编译程序,提示 incomplete type “struct sigaction“ is not allowed

问题描述 incomplete type "struct sigaction" is not allowed解决办法 在代码的最顶端添加如下代码即可 #define _XOPEN_SOURCE此定义不是简单的宏定义,是使程序符合系统环境的不可缺少的部分 _XOPEN_SOURCE为了实现XPG:The X/Open Porta…

零一万物Yi-1.5开源,34B/9B/6B多尺寸,34B超Qwen1.5-72B

前言 近年来,大型语言模型(LLM)在各个领域展现出惊人的能力,为人们的生活和工作带来了巨大的改变。然而,大多数开源 LLM 的性能仍然无法与闭源模型相媲美,这限制了 LLM 在科研和商业领域的进一步应用。为了…

element-plus表格的表单校验如何实现,重点在model和prop

文章目录 vue&#xff1a;3.x element-plus&#xff1a;2.7.3 重点&#xff1a; 1) tableData放到form对象里 2) form-item的prop要写成tableData.序号.属性 <!--table-表单校验--> <template><el-form ref"forms" :model"form"><e…

leetcode 207.课程表

思路&#xff1a;拓补排序 数据结构中的知识&#xff0c;这道题其实本质上就是判断在课程表的这个有向图当中是否有环存在&#xff0c;如果有环&#xff0c;说明不能学完&#xff1b;没有环说明可以。判断有无环的做法是拓补排序最好解决。 下面就是拓补排序的做法了&#xf…

安装mpi4py与dlio_profiler_py的总结

安装mpi4py mpi4py是一个Python库&#xff0c;它提供了与MPI&#xff08;Message Passing Interface&#xff09;兼容的接口&#xff0c;使得Python程序能够利用MPI实现并行计算。mpi4py 的核心是基于MPI标准的C/C实现&#xff0c;它能够在高性能计算环境下进行高效的并行处理…

软考之信息系统管理知识点(3)

流水线&#xff1a;是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的&#xff0c;它们可同时为多条指令的不同部分进行工作&#xff0c;以提高各部件的利用率和指令的平均执行速度。 编译得过程 关系数据库是表的集合 …

【全网最全】2024电工杯数学建模A题前两问完整解答+21页初步参考论文+py代码+保奖思路等(后续会更新成品论文)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题前两问完整解答21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有…

力扣:92. 反转链表 II(Java)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的…

Springboot 开发 -- 创建Spring Boot Starter

一、简介 Spring Boot Starter是Spring Boot生态中非常重要的一部分&#xff0c;它允许开发者通过简单的依赖管理来快速集成各种功能和库。在开发过程中&#xff0c;我们经常会遇到一些通用的功能或配置&#xff0c;如果每次都需要手动添加这些配置和依赖&#xff0c;那么将会…

网络采集受限?如何解决指纹识别、IP封禁、验证码、账号多登等问题

网页采集是什么 网页采集&#xff0c;也常被称作网络采集、网络数据抓取&#xff0c;是一种通过自动化工具从网站上获取信息的技术。这些技术通过访问网页&#xff0c;解析页面上的内容&#xff0c;并提取出有价值的数据&#xff0c;如文本、图片、链接等。 网页采集通常用于…

Leedcode34. 在排序数组中查找元素的第一个和最后一个位置_Java解法

Problem: 34. 在排序数组中查找元素的第一个和最后一个位置 题目描述思路解题方法复杂度Code 题目描述 34. 在排序数组中查找元素的第一个和最后一个位置 力扣链接 给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置…

Python 调整PDF文件的页面大小

在处理PDF文件时&#xff0c;我们可能会遇到这样的情况&#xff1a;原始PDF文档不符合我们的阅读习惯&#xff0c;或者需要适配不同显示设备等。这时&#xff0c;我们就需要及时调整PDF文档中的页面尺寸&#xff0c;以满足不同应用场景的需求。 利用Python语言的高效性和灵活性…

Linux--网络通信(一)概述

网络通信概述 网络通信本质上是一种进程间通信&#xff0c;是位于网络中不同主机上的进程之间的通信&#xff0c;属于 IPC 的一种&#xff0c; 通常称为 socket IPC。所以网络通信是为了解决在网络环境中&#xff0c;不同主机上的应用程序之间的通信问题。 大概可以分为三个层…

优化关联查询

三个表的创建语句 CREATE TABLE test.afx_output_source_item (cheadguid INT NOT NULL,goodsid INT NULL,goodsno VARCHAR(45) NULL,goodsname VARCHAR(45) NULL,model VARCHAR(45) NULL,goodstaxno VARCHAR(45) NULL,PRIMARY KEY (cheadguid));CREATE TABLE test.afx_output…

23种设计模式之一————外观模式详细介绍与讲解

外观模式详细讲解 一、概念二、 外观模式结构核心思想及解释模式的UML类图模式角色应用场景模式优点模式缺点 三、实例演示图示代码展示运行结果 一、概念 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c…

【问题解决】Android Studio Jellyfish新建Kotlin项目后Gradle Sync及Maven下载很慢

创建新项目之后&#xff0c;Gradle Sync和Build都很慢&#xff0c;因为下载Gradle和Maven等工具。 代码默认配置 settings.gradle.kts pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.g…

ASSM是Automatic Segment Space Management(自动段空间管理)解析

ASSM是Automatic Segment Space Management&#xff08;自动段空间管理&#xff09;的缩写&#xff0c;是Oracle数据库引入的一项重要特性&#xff0c;首次出现在Oracle 9i中。ASSM旨在简化空间管理和提高数据库性能&#xff0c;特别是对于表和索引段的空间分配和回收过程。 在…

Android Activity 设计详解

文章目录 Android Activity 设计说明1. Activity 的生命周期2. Activity 的启动模式3. Activity 的通信4. Activity 的布局和视图管理5. Activity 的配置变化处理6. Activity 的保存和恢复状态7. Activity 的任务和返回栈 总结 Android Activity 设计说明 在 Android 中&#…

Ansible01-Ansible的概述、实验环境初始化、Inventory

目录 写在前面1. Ansible是什么1.1 简介与来历1.2 Ansible的特点1.3Ansible的架构与工作流程1.3.1 ansible 任务执行模式1.3.2 ansible 执行流程1.4 Ansible的模块 2. Ansible实验初始化2.1 实验环境2.2Ansible的安装2.2.1 Ansible的程序结构 2.3 修改Ansible配置文件2.3.1 配置…