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

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

Java 继承和多态的作用及好处

《Java继承和多态的作用及好处》文章讲解Java继承与多态的概念、语法及应用,继承通过extends复用父类成员,减少冗余;多态实现方法重写与向上转型,提升灵活性与代码复用性,动态绑定降低圈复杂度... 目录1. 继承1.1 什么是继承1.2 继承的作用和好处1.3 继承的语法1.4 子类访问父类里面的成

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加