单例模式作用特点及常见的单例模式分析(6种单例模式分析)

2023-12-25 17:18

本文主要是介绍单例模式作用特点及常见的单例模式分析(6种单例模式分析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单例模式:

  1. 即在整个生命周期中,对于该对象的生产始终都是一个,不曾变化。
  2. 保证了一个类仅有一个实例,并提供一个访问它的全局访问点。

作用:

  1. 在要求线程安全的情况下,保证了类实例的唯一性,线程安全。
  2. 在不需要多实例存在时,保证了类实例的单一性。不浪费内存。

特点:

  1. 公有的方法获取实例,
  2. 私有的构造方法,
  3. 私有的成员变量。

 

一,饿汉式
* @Description 饿汉式单例
     * 饿汉式单例关键在于singleton作为类变量并且直接得到了初始化,即类中所有的变量都会被初始化
     * singleton作为类变量在初始化的过程中会被收集进<clinit>()方法中,该方法能够百分之百的保证同步,
     * 但是因为不是懒加载,singleton被加载后可能很长一段时间不被使用,即实例所开辟的空间会存在很长时间
     * 虽然可以实现多线程的唯一实例,但无法进行懒加载;

package com.liruilong.singleton;/*** @Author: Liruilong* @Date: 2019/7/20 17:55*/// final 不允许被继承
public final class Singleton {// 实例变量private byte[] bate = new byte[1024];// 私有的构造函数,即不允许外部 newprivate Singleton(){ }private  static final Singleton singleton1 = new Singleton();public static  Singleton getInstance1(){return singleton1;}

二,懒汉式

小说网 https://m.v1122.com

* @Description 懒汉式单例模式
     * 可以保证懒加载,但是线程不安全
     * 当有两个线程访问时,不能保证单例的唯一性

package com.liruilong.singleton;/*** @Author: Liruilong* @Date: 2019/7/20 17:55*/// final 不允许被继承
public final class Singleton {// 实例变量private byte[] bate = new byte[1024];// 私有的构造函数,即不允许外部 newprivate Singleton(){ }private static  Singleton singleton =null;
public static Singleton getInstance(){if (singleton == null) {singleton = new Singleton();}return singleton;}

三,懒汉式加同步方法
* @Description 懒汉式+同步方法单例模式
     * 即能保证懒加载,又可以保证singleton实例的唯一性,但是synchronizeed关键字的排他性导致
     * getInstance0()方法只能在同一时间被一个线程访问。性能低下。

 

package com.liruilong.singleton;/*** @Author: Liruilong* @Date: 2019/7/20 17:55*/// final 不允许被继承
public final class Singleton {// 实例变量private byte[] bate = new byte[1024];// 私有的构造函数,即不允许外部 newprivate Singleton(){ }
private static  Singleton singleton =null;
public static synchronized Singleton getInstance0(){if (singleton == null) {singleton = new Singleton();}return singleton;}

四,双重效验锁单例
* @Description 双重校验锁单例(Double-Check)+Volatile
     *  对懒汉-同步方法的改进,当有两个线程发现singleton为null时,只有一个线程可以进入到同步代码块里。
     *  即满足了懒加载,又保证了线程的唯一性
     *  不加volition的缺点,有时候可能会报NPE,(JVM运行指令重排序)
     *  有可能实例对象的变量未完成实例化其他线程去获取到singleton变量。
     *  未完成初始化的实例调用其方法会抛出空指针异常。

 

package com.liruilong.singleton;/*** @Author: Liruilong* @Date: 2019/7/20 17:55*/// final 不允许被继承
public final class Singleton {// 实例变量private byte[] bate = new byte[1024];// 私有的构造函数,即不允许外部 newprivate Singleton(){ }private  static volatile Singleton singleton2 = null;
public static Singleton getInstance4() {if (singleton2 == null){synchronized (Singleton.class){if (singleton2 ==null){singleton2 = new Singleton();}}}return singleton2;}

 

五,静态内部类单例
 * @Description 静态内部类的单例模式
     * 在Singleton类初始化并不会创建Singleton实例,在静态内部类中定义了singleton实例。
     * 当给静态内部类被主动创建时则会创建Singleton静态变量,是最好的单例模式之一
   

package com.liruilong.singleton;/*** @Author: Liruilong* @Date: 2019/7/20 17:55*/// final 不允许被继承
public final class Singleton {// 实例变量private byte[] bate = new byte[1024];// 私有的构造函数,即不允许外部 newprivate Singleton(){ }private  static class Singtetons{
private static Singleton SINGLETON = new Singleton();/* static {final Singleton SINGLETON = new Singleton();}*/}public static Singleton getInstance2(){return Singtetons.SINGLETON;}

六,枚举类单例 

 * @Description 基于枚举类线程安全
     * 枚举类型不允许被继承,同样线程安全的,且只能被实例化一次。

 

package com.liruilong.singleton;/*** @Author: Liruilong* @Date: 2019/7/20 17:55*/// final 不允许被继承
public final class Singleton {// 实例变量private byte[] bate = new byte[1024];// 私有的构造函数,即不允许外部 newprivate Singleton(){ }
private enum Singtetonss {SINGTETONSS; //实例必须第一行,默认 public final static修饰private Singleton singleton;Singtetonss() { //构造器。默认私有this.singleton = new Singleton();}public static Singleton getInstance() {return SINGTETONSS.singleton;}}public static  Singleton getInstance3(){return Singtetonss.getInstance();}

 

原本是我笔记里的,摘了出来,面试的时候看,

更多见 ----》《Java并发编程详解》读书笔记

 

这篇关于单例模式作用特点及常见的单例模式分析(6种单例模式分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536298

相关文章

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I