单例模式作用特点及常见的单例模式分析(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

相关文章

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(