单例模式编写

article/2025/9/19 2:32:08

单例">什么是单例

单例是保证一个内存/进程里只有一个类的实例,并提供一个访问它的全局访问点。

  • 内存/进程中只有一个实例
  • 线程安全
  • 性能优化
  • 防止序列化产生新对象

写一个单例模式

1、饿汉模式

public class Singleton {//饿汉模式private static Singleton singleton=new Singleton();//私有构造方法private Singleton() {}//public static Singleton getSingleton() {return singleton;}
}	

就是在项目启动时,直接把对象new出来,不管他有没有使用;

2、懒汉模式

需要的时候,才会去new对象

懒汉-(非线程安全)

public class Singleton {//懒汉模式private  static Singleton singleton;private Singleton() {}public static Singleton getSingleton() {if (singleton == null) {Singleton singleton=new Singleton();}return singleton;}
}

但是这个方法来说的话,线程不安全,会导致,多个线程触发时,可能出现创建出多个对象;所以我们后面要使用线程安全的模式进行,给对应方法加上锁

懒汉-(线程安全)

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

但是这个锁是放在方法上,加的比较重,所以为了优化这块内容,我们需要进行优化,所以又有双重校验锁的实现方式,将所放在需要的代码块上就可以

双重校验锁

大部分情况下,同步代码块都不会执行到,提高了程序的性能。

有一种情况,两个线程ThreadA,ThreadB,如果threadA执行到了第一个if条件判断,singleton = null;ThreadB也执行到了if条件判断singleton = null,所以A和B会依次执行同步代码块里的代码。为了避免创建两个实例,因此又在同步代码块里添加了if条件进行二重检验。

public class Singleton {
private  static Singleton singleton;private Singleton() {}public static Singleton getSingleton() {if (singleton==null) {synchronized (Singleton.class) {if (singleton==null) {Singleton singleton=new Singleton();}}}return singleton;}}

隐患:

在执行这步时,会出现JVM会进行指令重排序;原本我们的流程为

1、分配内存空间2、初始化对象  3、设置当前对象指向的内存空间

但是在这边的话,会出现指令重排序的问题,也就是步骤会变为

1->3->2,线程A执行到第3步时,线程B调用getsingleton方法,在判断singleton==null时不为null,则返回singleton。但此时singleton并还没初始化完毕,线程B访问的将是个还没初始化完毕的对象。所以这边我们会使用volatile关键字,就是为了避免出现指令重排序的问题;当声明对象的引用为volatile后,伪代码的2、3的重排序在多线程中将被禁止!

public class Singleton {
private volatile static  Singleton singleton;private Singleton() {}public static Singleton getSingleton() {if (singleton==null) {synchronized (Singleton.class) {if (singleton==null) {Singleton singleton=new Singleton();}}}return singleton;}}

注意:

最主要的两个步骤:

 private Singleton() {}:私有化的构造方法

:通过一个public的方法,把这个singleton对象暴露出去

这样的话,就实现了一个单例

 


http://chatgpt.dhexx.cn/article/uMgxccDT.shtml

相关文章

设计模式——单例模式八种方式实现与分析(附代码示例)

一. 概念 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 单例模式保证了系统内存中该类只存在一个对象&#xf…

C++ 单例模式 代码详解

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

[设计模式] -- 单例模式

Emai : hahayacodergmail.com 背景 最近在公司的项目中,经常会用到单例模式,由于之前没有想过怎么正确使用单例模式,导致写成的程序中有BUG。在学习Cocos2d-x时,导演类CCDirector等都是单例类。所以从头开始学习单例模式。 介绍 …

单例模式介绍

目录 1 前言 2 单例模式类型 2.1 饿汉式: 2.2 懒汉式: 2.2.1 双重检查锁 2.2.2 volatile防止指令重排 2.3 静态内部类 3 破坏单例 1 前言 单例模式是指在内存中有且只会创建一次对象的设计模式,在程序中多次使用同一个对象且作用相同…

单例模式详解(附常见的7种单例模式源码)

单例模式(Singleton Pattern):保证一个类仅有一个对象,并提供一个访问它的全局访问点。(Ensure a class only has one instance,and provide a globe point of access to it.) 常见应用场景: Windows的Task Manager(…

设计模式(一)—单例模式(附Java代码)

单例模式(Singleton Pattern):采取一定的方法保证在整个的软件系统中,对于某个类只能存在一个对象实例,并且该类只提供一个取得其实例对象的方法。 比如Hibernate的SessionFactory,它充当数据存储源的代理,…

线程的运行状态

不管是多线程还是多进程,实际上都不太可能一直占用CPU资源,所有多线程的几种状态一定要掌握。 多线程的状态如下图: 所有的系统费资源是有限的,不管是多线程还是多进程都必须在执行一段时间后让出资源,交由其他的线程…

一条SQL语句统计总数及各状态数

需求:共有协议X份,已签XX份,待签X份 sql: select count(1) 总记录数,sum(case when XY_STATUS1 then 1 else 0 end)待签,sum(case when XY_STATUS2 then 1 else 0 end)已签 from YG.T_ZHGL 结果: count(1):所有数据&#xff…

线程的执行状态

1,创建: 当创建好线程对象的时候,也就是new Thread类或者是new Thread子类的时候。此时称为创建状态 2,就绪: 当线程对象调用了start()方法,开启线程了的时候,此时的线程已经开启了&…

Java线程线程的状态

1、线程的状态 线程有六种状态:分别如下 ① NEW(新建) 线程刚被创建,但是并未启动。还没调用start方法 ② Runnable(可运行) 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统…

Java多线程批量执行sql

当遇到大sql批量导入时几十万上百万数据,使用plsql执行等都是非常的慢。因此开发一套自定义线程池处理sql: 1,线程代码 import java.util.ArrayList;/*** ClassName: com.ai.order.esb.yulang.tools.handle* Description: TODO* version: v1…

一条SQL语句是如何执行的?

大家六一儿童节好呀! 接下来的一段时间内,将带领大家一同探索MySQL的奥妙,加油吧!我们。 下面进入正题:一条SQL语句是如何进行的? 对于这个问题,我想将其分为两个问题来回答,分别是…

mysql 查看线程状态

show full PROCESSLIST 打开两个查询窗口,在A窗口执行一个查询时间较长的sql,在B窗口使用show full PROCESSLIST,可以看到A中执行的sql时间。 sleep表示没有操作,query表示正在查询。

线程状态总结

目录 文章目录 前言 一、线程状态图解 二、线程的几种状态 及线程过程 1.线程的几种状态 2.线程过程 总结 前言 总结了在华清远见这段时间所学的线程相关的知识点,文章记录了线程的几种状态及线程的过程 提示:以下是本篇文章正文内容,下面案…

线程状态

原文:https://mp.weixin.qq.com/s/GsxeFM7QWuR--Kbpb7At2w 人类为了利用好自己的时间,经常会同时做多件事情,比如上厕所时刷手机,开车时听新闻... 对于自己尚且如此,对计算机也不能闲着。为了最大化的提升机器利用率&…

一条SQL语句的执行过程

摘要 本文站在后端开发的角度,讲述一条SQL从客户端发送到MySQL服务器进行处理,并将结果返回给客户端的过程。这个过程中涉及的操作会在后面的文章中做详细的分析。 连接建立 我们通常使用ORM框架来生成SQL语句,在发送SQL语句给MySQL服务器…

多线程执行sql报错处理

pymysql多线程访问数据库报错:Packet sequence number wrong - got 7 expected 2 原文:https://www.cnblogs.com/heiao10duan/p/9373237.html参考:https://www.jianshu.com/p/60c8e0e440ea原因: 使用了多线程,多线程共…

MySQL - 一条 SQL 语句是如何执行的(SQL执行详解)

前言 天天和数据库打交道,一天能写上几十条 SQL 语句,但你知道我们的系统是如何和数据库交互的吗?MySQL 如何帮我们存储数据、又是如何帮我们管理事务?....是不是感觉真的除了写几个 「select * from dual」外基本脑子一片空白&a…

一、SQL语句执行过程

一、MySQL架构图 MySQL逻辑架构图,可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等&…

线程状态详解

线程的生命周期 new的时候即为创建状态。 调用start即为启动了,启动线程后就变为就绪状态, 就绪之后等待CPU的调度,CPU调度完之后,就进入了运行状态。 运行状态运行sleep方法时会进入阻塞状态,进入阻塞状态有非常多…