单例模式作用特点及常见的单例模式分析(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编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑