Java设计模式(一)——单例模式
创始人
2025-06-01 12:45:10
0

        单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。当系统需要某个类能有一个实例时,就可以采用单例模式。

特点:

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象都能提供这一实例

 实现方式:

保证单例模式仅有一个实例的核心思想就是构造方法私有化。

(1)方式一:直接实例化

public class Singleton {//构造方法私有化private Singleton() {}//直接产生单例实例//直接定义了静态成员变量single,并通过new Singleton() 完成了初始化,之后不再变化,对象single是线程安全的private static final Singleton single = new Singleton();//提供单例对象方法//外部类可以通过静态方法 getInstance() 返回单例对象的实例public static Singleton getInstance() {return single;}
}

(2)方式二:延迟实例化

public class Singleton2 {private Singleton2() {}//先置为空private static Singleton2 single = null;//其他外部类调用getInstance() 方法时,再进行实例化并返回public static Singleton2 getInstance() {if (single == null) {single = new Singleton2();}return single;}
}

但是方式二存在线程安全问题,可能由两个外部类同时调用 getInstance() 方法,这样就会产生两个实例。有三种解决方法:

(1)方法一:完全同步方法

    public static  synchronized Singleton2 getInstance() {if (single == null) {single = new Singleton2();}return single;}

在方法前加了 synchronized 修饰,一个线程必须完全执行完 getInstance() 方法,下一个线程才能调用getInstance();

(2)方法二:部分同步方法

使用了双重锁,用两行相同的语句  if (single == null)  ,第一句可以并行运行,第二句不可以。

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

问:为什么synchronized括号里要传入Singleton2.class?

答:synchronized 关键字用于实现多线程环境下的同步,确保在同一时间只有一个线程可以访问被保护的代码块。在这个单例模式的实现中,synchronized 保证了在多线程环境下只会创建一个实例。 Singleton2.class 是一个类级别的对象,它是一个在 JVM 中唯一的对象。在 Java 中,每个类都有一个类对象,可以通过该类的 .class 属性获取。当使用 synchronized 时,如果传递一个类对象作为锁,则该锁对象将是全局唯一的,可以确保多线程环境下对该类实例的同步访问。因此,在这个实现中,Singleton2.class 被传递给 synchronized 作为锁对象,以确保在多线程环境下只会创建一个实例。

(3)方式三:静态内部类

        这是一种使用私有静态嵌套类实现单例设计模式的实现方式。 外部类 Singleton3 中有一个名为 My 的私有静态嵌套类,它拥有一个名为 single 的静态 final 字段,该字段持有 Singleton3 的实例。 通过将实例化的 Singleton3 对象作为静态 final 字段存储在内部类 My 中,保证了在整个应用程序中只有一个实例,并且该实例在运行时被延迟初始化。getInstance() 方法通过返回 My.single 来获取该实例。由于 single 字段是静态 final 的,因此在单例对象创建之后,任何尝试修改该对象的操作都将被忽略。

        当Java虚拟机加载应用程序字节码时,单例对象并不是立即加载的,当第一次运行My.single时,单例对象才会动态生成。

public class Singleton3 {private static class My {private static final Singleton3 single = new Singleton3();}public static final Singleton3 getInstance() {return My.single;}
}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...