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

Head First Design Patterns - 单例模式

什么是单例模式

  • 单例模式确保应用中,一个类最多只有一个实例
  • 单例模式也提供访问此实例的全局访问点
  • 单例模式实现中,使用了一个私有构造器,一个静态方法以及一个静态变量

为什么要用单例模式

java中静态全局变量也能做到被实例化一次

但是对于全局变量而言,这个全局变量对象可能在应用启动的时候就被创建,如果这个对象是资源密集型的,则长时间没使用,就对资源不是很友好。

单例模式可以使得对象延迟被创建,对于资源密集型的应用来说很重要。

单例模式的实现方式

  1. 简单的实现方式:
public class Singleton {private static Singleton uniqueInstance;// 其他有用的实例变量private Singleton() {};public static Singleton getInstance() {if (uniqueInstance == null) {uniqueInstance = new Singleton();}return uniqueInstance;}

优点:符合单例模式的定义,满足单例模式的要求
缺点:在多线程的环境下,容易产生多个实例

  1. 多线程情况下的同步方式
public class Singleton1 {private static Singleton1 uniqueInstance;// 其他有用的实例变量private Singleton1() {};public static synchronized Singleton1 getInstance() { // synchronized设置成同步的if (uniqueInstance == null) {uniqueInstance = new Singleton1();}return uniqueInstance;}
}

优点:同步方式可以解决多线程并发的问题
缺点:同步锁很重,容易带来性能低下的问题

  1. 饿汉模式,让JVM来保证实例的唯一性
public class Singleton2 {private static Singleton2 uniqueInstance = new Singleton2(); // JVM来保证唯一性private Singleton2() {};public static Singleton2 getInstance() {return uniqueInstance;}
}

优点:让JVM来保证实例的问一下,可以解决多线程带来的并发问题
缺点:使用不够灵活

  1. 双重检查加锁
public class Singleton3 {private volatile static Singleton3 uniqueInstance;private Singleton3() {};public static Singleton3 getInstance() {if (uniqueInstance == null) {synchronized (Singleton3.class) {if (uniqueInstance == null) {uniqueInstance = new Singleton3();}}}return uniqueInstance;}
}

优点:可以解决同步过重的问题
缺点:至少得在java5以上才能运行

  1. 枚举方式实现单例
public enum SingletonEnum {INSTANCE,public void testMethod() {System.out.println("执行了单例类的方法");}
}

优点:真正做到线程安全,避免上述方法隐藏的问题

参考文档:单例模式加锁/枚举

相关文章:

Head First Design Patterns - 单例模式

什么是单例模式 单例模式确保应用中,一个类最多只有一个实例单例模式也提供访问此实例的全局访问点单例模式实现中,使用了一个私有构造器,一个静态方法以及一个静态变量 为什么要用单例模式 java中静态全局变量也能做到被实例化一次 但是…...

Mysql的备份还原

模拟环境准备 创建一个名为school的数据库,创建一个名为Stuent的学生信息表 mysql> create database school; Query OK, 1 row affected (0.00 sec)mysql> use school; Database changed mysql> CREATE TABLE Student (-> Sno int(10) NOT NULL COMME…...

分区表介绍

问题 单表数据量过大,查询的性能通常会变得很低 查询时磁盘的IO次数增加:MySQL的InnoDB引擎使用B树维护索引,一个典型的索引节点大概可以存储60-120个数据记录,一个三层的索引大概可以存储百万条数据。如果订单表增加一个数量级…...

emacs 源码分析(七)

文章目录 emacs源码分析&#xff08;七&#xff09;自己动手把emacs的DEFUN宏抠出来 <2024-01-07 周日> emacs源码分析&#xff08;七&#xff09; 这DEFUN宏就像胶水一样&#xff0c;它把c代码和emacs-lisp代码给联系起来。但是DEFUN宏看着怪恐怖的有没有&#xff01;…...

Linux运维-Web服务器的配置与管理(Apache+tomcat)(没成功,最后有失败经验)

Web服务器的配置与管理(Apachetomcat) 项目场景 公司业务经过长期发展&#xff0c;有了很大突破&#xff0c;已经实现盈利&#xff0c;现公司要求加强技术架构应用功能和安全性以及开始向企业应用、移动APP等领域延伸&#xff0c;此时原来开发web服务的php语言已经不适应新的…...

探讨分布式数据库ID生成解决方案

在技术面试中&#xff0c;面试官通常通过挑战应聘者的分布式系统知识来评估其能力。今天&#xff0c;让我们模拟一场面试现场&#xff0c;深入了解关于分布式数据库ID生成的解决方案。 面试官&#xff1a;嘿&#xff0c;小伙子&#xff0c;分布式数据库ID生成解决方案了解吗&a…...

Clickhouse填坑记4:Too many parts问题分析

Clickhouse在进行大数据量同步时,感觉很爽,插入速度非常快,但是,在使用过程中却出现了几次“Too many parts”异常报错,搞得很痛苦,这里记录一下解决过程。 我这边采用的是Flink程序,实时将数据写入ClickHouse,在执行一段时间后,会提示“Too many parts”异常,如下异…...

CertiK CSO Dr. Kang Li 确认出席Hack .Summit() 香港区块链盛会

CertiK CSO Dr. Kang Li 确认将出席由 Hack VC 主办&#xff0c;并由 AltLayer 和 Berachain 联合主办&#xff0c;与 SNZ 和数码港合作&#xff0c;由 Techub News 承办的Hack.Summit() 2024区块链开发者盛会。 Dr. Kang Li 目前担任CertiK首席安全官。他是清华蓝莲花战队启蒙…...

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…...

用html编写的简易新闻页面

用html编写的简易新闻页面 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

docker-mysql:5.7安装

1、下载mysql:5.7镜像 [rootlocalhost ~]# docker search mysql (某个XXX镜像名字) [rootlocalhost ~]# docker pull mysql:5.7 按装之前查看一下是否按装过mysql。如果安装过会占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、简单的安装 [rootlocalhost ~]# d…...

SQLPro Studio:数据库管理的革命性工具 mac版

SQLPro Studio是一款强大的数据库管理和开发工具&#xff0c;它旨在提供高效、便捷和安全的数据库操作体验。无论是数据库管理员、开发人员还是数据分析师&#xff0c;SQLPro Studio都能满足他们在数据库管理、查询、设计和维护方面的需求。 SQLPro Studio mac版软件获取 首先…...

【小沐学QT】QT学习之OpenGL开发笔记

文章目录 1、简介2、Qt QOpenGLWidget gl函数3、Qt QOpenGLWidget qt函数4、Qt QOpenGLWindow5、Qt glut6、Qt glfw结语 1、简介 Qt提供了与OpenGL实现集成的支持&#xff0c;使开发人员有机会在更传统的用户界面的同时显示硬件加速的3D图形。 Qt有两种主要的UI开发方…...

kali安装ARL灯塔(docker)

1、root身份进入容器 ┌──(root㉿Kali)-[~/桌面] └─# su root ┌──(root㉿Kali)-[~/桌面] └─# docker 2、先更新再克隆 ┌──(root㉿Kali)-[~/桌面] └─# apt-get update …...

字节面试分享,请详细介绍为何Http Post发送两次请求

在浏览器中&#xff0c;内容是很开放的&#xff0c;任何资源都可以接入其中&#xff0c;如 JavaScript 文件、图片、音频、视频等资源&#xff0c;甚至可以下载其他站点的可执行文件。 但也不是说浏览器就是完全自由的&#xff0c;如果不加以控制&#xff0c;就会出现一些不可…...

Flink CDC 3.0 Starrocks建表失败会导致任务卡主!

Flink CDC 3.0 Starrocks建表失败会导致任务卡主&#xff01; 现象 StarRocks建表失败&#xff0c;然后任务自动重启&#xff0c;重启完毕后数据回放&#xff0c;jobMaster打印下面日志后&#xff0c;整个任务会卡主 There are already processing requests. Wait for proce…...

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面

目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件&#xff0c;它与 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;紧密集成。LVGL 是一个轻量化的、开源的…...

Selenium IDE插件录制网页,解放双手

1、 国内下载地址 https://www.crx4chrome.com/crx/77585/ &#xff0c;这个网络正常基本可以下载&#xff0c;目前最新版本是3.17.2。 点击Crx4Chrome下载。下载后的文件名称是&#xff1a;mooikfkahbdckldjjndioackbalphokd-3.17.2-Crx4Chrome.com.crx。 2、 安装 直接打开…...

【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组

1794.【软件认证】最长的指定瑕疵度的元音子串 这个例题&#xff0c;是滑动窗口中长度不定求最大的题目&#xff0c;在看题之前可以先看一下【leetcode每日一题】【滑动窗口长度不固定】案例。 题目描述 定义&#xff1a;开头和结尾都是元音字母&#xff08;aeiouAEIOU&…...

水库安全监测方案(福建地区水库安全监测案例分享)

我司星创易联最近在福建省受到了一个水库安全监测系统项目的委托。该水库位于福建中部山区,作为该地区的重要防洪与供水工程,对下游数十万人的生活产生重大影响。但是因为水库附近地质情况复杂,水库大坝在多次洪水冲击下出现一定病害,亟须全面加强对水库大坝安全状况的监测,以确…...

手把手教你用Qwen3-VL-8B:上传图片就能提问的AI助手搭建

手把手教你用Qwen3-VL-8B&#xff1a;上传图片就能提问的AI助手搭建 1. 为什么你需要这个AI助手 想象一下这样的场景&#xff1a;你正在整理手机里上千张照片&#xff0c;突然看到一张多年前的旅行照&#xff0c;却想不起来具体是在哪里拍的。或者你收到一张复杂的图表&#…...

浏览器书签管理的革命性解决方案:Neat Bookmarks树状扩展深度解析

浏览器书签管理的革命性解决方案&#xff1a;Neat Bookmarks树状扩展深度解析 【免费下载链接】neat-bookmarks A neat bookmarks tree popup extension for Chrome [DISCONTINUED] 项目地址: https://gitcode.com/gh_mirrors/ne/neat-bookmarks 你是否曾在数百个杂乱书…...

FPGA实战:手把手教你用DDS生成1MHz正弦波(附完整代码)

FPGA实战&#xff1a;从零构建1MHz正弦波发生器的工程指南 在数字信号处理领域&#xff0c;直接数字频率合成&#xff08;DDS&#xff09;技术因其高精度、快速切换和灵活配置的特性&#xff0c;已成为现代电子系统中的核心技术之一。本文将带领FPGA初学者和需要快速实现DDS功能…...

flutter-unity-view-widget AR 增强现实开发完全指南:ARKit 和 ARCore 集成

flutter-unity-view-widget AR 增强现实开发完全指南&#xff1a;ARKit 和 ARCore 集成 【免费下载链接】flutter-unity-view-widget Embeddable unity game engine view for Flutter. Advance demo here https://github.com/juicycleff/flutter-unity-arkit-demo 项目地址: …...

Mac用户如何通过12306ForMac实现高效抢票?四个核心功能详解

Mac用户如何通过12306ForMac实现高效抢票&#xff1f;四个核心功能详解 【免费下载链接】12306ForMac An unofficial 12306 Client for Mac 项目地址: https://gitcode.com/gh_mirrors/12/12306ForMac 还在为节假日抢不到火车票而烦恼吗&#xff1f;作为Mac用户&#xf…...

天龙八部单机版GM工具:5分钟上手,告别复杂数据库操作

天龙八部单机版GM工具&#xff1a;5分钟上手&#xff0c;告别复杂数据库操作 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 你是否曾为修改《天龙八部》单机版游戏数据而烦恼&#xff1f;是否面对复…...

别再暴力解压了!用python-docx库精准提取Word文档内嵌图片(附源码)

用python-docx精准提取Word文档图片的工程实践 在文档自动化处理领域&#xff0c;Word文档中的图片提取是个高频需求。许多开发者第一反应是用zipfile解压.docx文件&#xff0c;然后在解压后的文件夹中寻找图片资源。这种方法看似直接&#xff0c;实则存在严重缺陷——你无法确…...

保姆级教程:非华为笔记本也能用上华为多屏协同,手把手搞定电脑管家11和NFC卡贴

非华为笔记本实现多屏协同的完整实战指南 在移动办公时代&#xff0c;华为的多屏协同功能因其无缝连接手机与电脑的体验而备受追捧。但这项功能原本仅限于华为生态设备使用&#xff0c;让许多非华为笔记本用户望而兴叹。本文将彻底打破这一限制&#xff0c;通过系统化的解决方案…...

BitNet b1.58-2B-4T实战指南:WebUI离线使用与本地模型缓存策略

BitNet b1.58-2B-4T实战指南&#xff1a;WebUI离线使用与本地模型缓存策略 1. 项目概述 BitNet b1.58-2B-4T是一款革命性的1.58-bit量化开源大模型&#xff0c;采用独特的-1、0、1三值权重设计&#xff08;平均1.58 bit&#xff09;&#xff0c;配合8-bit整数激活&#xff0c…...

Qwen3.5-9B-GGUF基础教程:llama-cpp-python callback函数实现流式进度

Qwen3.5-9B-GGUF基础教程&#xff1a;llama-cpp-python callback函数实现流式进度 1. 项目概述与模型介绍 Qwen3.5-9B-GGUF是阿里云开源的Qwen3.5-9B模型经过GGUF格式量化后的版本。这个90亿参数的稠密模型采用了创新的Gated Delta Networks架构和混合注意力机制&#xff08;…...