java单例模式--Java单例模式以及6种实现方式

article/2025/9/11 15:54:52

文章目录

  • 前言
  • 一、单例模式的定义
  • 二、单例模式特点
  • 三、实现单例模式的八种方式及优缺点
  • 总结


前言

今天老师考到了单例模式,我对这个知识点掌握的不是很好,所以总结此文来使自己深入了解Java中的单例模式~~同时也借鉴给和我一样不懂的友友们~~~

 


一、单例模式定义

Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。

二、单例模式特点

1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。


三、实现单例模式的六种方式

1 饿汉式--静态常量[可用]

public class Singleton {
//2.创建类内静态属性为该类对象,并使用final和private进行修饰,避免其能够修改private static final Singleton SINGLE_INSTANCE = new Singleton();//3.将这一个单例使用get方法返回到调用者手中public static Singleton getSingleInstance() {return SINGLE_INSTANCE;}//1.将构造方法私有	private Singleton() {// TODO Auto-generated constructor stub}
}

优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。

缺点:在类装载的时候就完成实例化,没有达到Lazy Loading(懒加载延迟加载)的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。

2饿汉式--静态代码块[可用]

public class Singleton {private static Singleton instance;static {instance = new Singleton();}
//构造函数私有private Singleton() {}
//提供静态方法public static Singleton getInstance() {return instance;}
}

这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。

3懒汉式(线程不安全)【不可用】

public class Singleton2 {// 私有构造private Singleton2() {}private static Singleton2 single;
//静态方法public static Singleton2 getInstance() {if(single == null){//线程1执行到此处cpu时间片到single = new Singleton2();}return single;}
}

优点:可以在使用开辟空间,不使用不开辟空间。

缺点:线程不安全

这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。

4懒汉式(线程安全,同步方法)【不推荐使用】

public class Singleton {private static Singleton singleton;private Singleton() {}public static synchronized Singleton getInstance() {//同步类方法if (singleton == null) {singleton = new Singleton();}return singleton;}
}

解决上面第三种实现方式的线程不安全问题,做个线程同步就可以了,于是就对getInstance()方法进行了线程同步。

优点:懒汉式,用的时候开辟内存。线程安全。

缺点:效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低要改进。

5懒汉式(线程安全--同步代码块,双重检查)【推荐用】

public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {///1.线程1	2.线程2	  4.线程2发现同步代码块,等待	6.线程2进入同步代码块,如果没有第二if直接new,线程不安全,因为有第二次if所以线程安全,进入第二个if发现不是null,直接退出同步锁。synchronized (Singleton.class) {//3.线程1if (singleton == null) {//3. 线程1,cpu走了singleton = new Singleton();//5.线程1执行,开辟地址,释放同步锁}}}return singleton;}
}

Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。

优点:线程安全;延迟加载;效率较高。

6静态内部类【推荐用】

public class Singleton {private Singleton() {}private static class SingletonInstance {//私有静态内部类private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonInstance.INSTANCE;}
}

这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。

类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。

优点:避免了线程不安全,延迟加载,效率高。

四、总结

不知不觉来到华清学习已经一个多月了,在这里每天我都能学习到新知识,慢慢发现了自己的问题,也渐渐找到了适合自己的学习方法和节奏,最后也希望读到这篇文章的你天天开心哦吼吼~~

希望这篇文章对大家有所帮助!!!

 


http://chatgpt.dhexx.cn/article/9TBePAL5.shtml

相关文章

java单例模式使用_Java单例模式的应用

单例模式用于保证在程序的运行期间某个类有且仅有一个实例。其优势在于尽可能解决系统资源。通过修改构造方法的访问权限就可以实现单例模式。 代码如下: public class Emperor { private static Emperor emperor null;// 声明一个Emperor类的引用 private Emperor…

创建型:Java单例模式

一.单例模式的定义: 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台…

java 单例模式 参数_Java单例模式

再孬再好,就你一个 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只…

java单例接口_JAVA单例模式

一.问题引入 偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过static来访问呢;如果构造方法是private的话,那么有什么好处呢;如果构造方法是private的话,会不更好的封装该内呢?我主要是应用在使用普通类模拟枚举类型里,后来发现这就是传说中…

java单例模式——详解JAVA单例模式及8种实现方式

本文转载自:java单例模式——详解JAVA单例模式及8种实现方式_EatingSoilLang的博客-CSDN博客_java单例模式 ## 单例模式是最简单也是最基础的设计模式之一,下边一起学习一下单例模式! 一.单例模式的定义: 单例模式确保某个类只有…

JAVA设计模式之单例模式

本文继续介绍23种设计模式系列之单例模式。 概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类…

Java多线程(七):单例模式详解

目录 1. 什么是单例模式 2. 单例模式的特点 3. 单例模式的实现 3.1 单例模式实现步骤 3.2 单例模式实现方式 3.2.1 饿汉方式 3.2.2 懒汉方式 1. 什么是单例模式 java中单例模式是一种常见的设计模式,单例模式确保某个类只有一个实例,而且自行实例…

ARFoundation之路-3D物体识别之一

版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。 3D物体跟踪技术,是指通过图像处理技术对摄像头中拍摄到的3D物体识别定位并对其姿态进行跟踪的技术。3D物体跟踪技术的基础也是图像识别,但比前述图…

ARFoundation系列讲解 - 57 3D物体识别一

一、介绍 目前在ARFoundation中,3D物体识别只支持A9处理器或更高版本的iOS设备,系统版本要求iOS 12或更高版本,Android不支持此功能 。使用3D物体识别跟踪功能需要预先采集3D物体特征点信息。苹果公司给我们提供了一个采集3D物体特征点工具,我们需要下载并使用Xcode编译成应…

实战三:手把手教你实现物体识别

实战三:手把手教你实现物体识别 一、基于HaadAdaboost实现人脸识别 1.原理介绍(参考下面的博客文章) http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html Haar分类器 Haar-like特征积分图方法AdaBoost级联 Haar分类器算法的…

手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码

文章目录 前言一、物体识别算法原理概述1、物体识别的概念2、Yolo算法原理概述 二、opencv调用darknet物体识别模型(yolov3/yolov4)1、darknet模型的获取2、python调用darknet模型实现物体识别3、LabVIEW调用darknet模型实现物体识别yolo_example.vi4、L…

颜色和移动物体识别系统

颜色和移动物体识别系统 1.开发工具 Python版本:Anaconda 的python环境3.8版本 开发软件:Pycharm社区版 识别模型:深度学习模型,普通学习模型 相关模块:opencv-python3.4.8.29模块 2.环境搭建 安装Anaconda并将路径添加…

[Vuforia]二.3D物体识别

之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。 首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能…

K210视觉体验—物体识别

K210视觉体验—物体识别 使用设备ZTFR开发板 人脸识别构造函数导入模型 示例代码基础测试 使用设备 ZTFR开发板 人脸识别 首先简单介绍一下 K210 的 KPU。KPU 是 K210 内部一个神经网络处理器,简单来说就是 KPU 能加载和运行各种现成的 AI 算法模型,实现…

tensorflow 物体识别

tensorflow推出的object detection模块,为我们做物体检测提供了极大的便利,如果还没有安装该模块,可以参照 http://blog.csdn.net/hanshuobest/article/details/79222685 下面的示例演示如何用已训练的模型做物体检测 import numpy as np …

计算机视觉物体识别的过程,计算机视觉之从OpenCV到物体识别(二)

前言:上一章节我们学会了图片、视频以及外设获取帧图片的方式,以及OpenCV 的灰度图片处理。计算机不像人眼可以很轻易地辨别物体,本质是将一张图片转换成灰度图,通过一定的模型训练,使得机器能够从0,1(黑与白)中分辨物体的特征,由局部到整体,图片越复杂,所需的训练程度…

unity c# 触摸屏物体识别桌算法

unity源码地址链接:unityc#触摸屏物体识别桌算法-C#文档类资源-CSDN下载 实操的时候出现算出来的坐标不对,没有时间去找问题,优化了,所以代码仅供参考。 使用的是Lean Touch插件,免费的。 模块由三个点构成&#xf…

如何用AR引擎技术, 5步优雅实现物体识别和跟踪

AR技术让应用实现虚拟世界和现实世界的融合,让开发者的创意和脑洞能够拥有更多炫酷有趣的呈现方式。AR拍照、AR购物、AR教育、AR搜索等丰富应用场景,凭借着AR技术的加持,为用户带来更优质的沉浸式体验,为用户创造更多价值。 例如…

物体识别全流程(Ubuntu16.04)结合ROS

物体识别全流程(Ubuntu16.04)结合ROS 1.使用labellmg,标记图片,生成xml标签 在此下载labellmg包 下载之后解压到要放置的目录 推荐使用Python3Qt5 打开labellmg包 在当前目录终端下运行如下命令行 sudo apt-get install pyqt5-…

opencv人脸识别以及自定义物体识别系统

目录 一、简介: 二、软硬件应用: 三、模块介绍: (一)人脸识别: (二)、自定义物体识别: (三)、图片展示: (四&#x…