【漫画】详解9种Java单例模式

https://blog.csdn.net/SolarL/article/details/88720516

本文

本文由SolarL投稿发布

本文来源于https://blog.csdn.net/SolarL/article/details/88720516

我最近在学习Java单例模式有点不太明白,能请教下你吗?

原来是小哀啊,可以啊

为什么要引入单例模式呢?

有的时候我们只需要

某个类只有一个对象产生

哦,原来是这样!

小哀,那考考你

知道单例模式的特点吗?

这。。刚学,不太懂呢

给我讲讲吧

那我给你仔细说说

单例模式的特点

  • 一个类只允许产生一个实例化对象。

  • 单例类构造方法私有化,不允许外部创建对象。

  • 单例类向外提供静态方法,调用方法返回内部创建的实例

化对象。

懒汉式(线程不安全)

其主要表现在单例类在外部需要创建实例化对象时再进行实例化,进而达到Lazy Loading 的效果。

通过静态方法 getSingleton() 和private 权限构造方法为创建一个实例化对象提供唯一的途径。

不足:未考虑到多线程的情况下可能会存在多个访问者同时访问,发生构造出多个对象的问题,所以在多线程下不可用这种方法。

懒汉式(线程安全,同步方法,不推荐使用)

针对懒汉式的线程不安全,自然会想到给 getSingleton() 进行 synchronized 加锁来保证线程同步。

不足:效率低。大多数情况下这个锁占用的额外资源都浪费了,每个线程在想获得类的实例时候,执行 getSingleton() 方法都要进行同步。

饿汉式(线程安全)

在进行类加载时完成实例化对象的过程就是饿汉式的形式。

避免了线程同步问题,在运行这个类的时候进行加载,之后直接访问

不足:相比接下来的静态内部类而言,这种方法比静态内部类多了内存常驻,容易造成内存浪费,也未达到延迟加载的效果。

静态内部类加载(线程安全)

静态内部类不会在单例加载时加载,当调用 getSingleton() 方法时才会进行加载,达到类似懒汉式效果,并且也是线程安全的。

类的静态属性只会在第一次加载类时进行初始化,所以上面的方法JVM 帮助我们保证了线程的安全性,在类进行初始化时,其他线程无法进入。

枚举(线程安全)

自由串行化;保证只有一个实例;线程安全。

Effective Java 作者所提倡的方法,近乎完美,在继承场景下不适用。

懒汉式双重校验锁法(通常线程安全,不可保证完全安全)

使用同步代码块避免了第二种方法的效率低的问题,但此方法并不能完全起到线程同步的作用,与上面第一种方法产生的问题相似,多线程访问时可能产生多个对象。

懒汉式双重检查终极版(面试手写推荐)

与第六种方法不同的是,此方法给singleton 的声明上加了关键字 volatile ,进而解决了低概率的线程不安全问题。

volatile 起到禁止指令重排的作用,在它赋值完成之前,就不会调用读操作(singleton == null)。

使用 ThreadLocal 实现(线程安全)

ThreadLocal 会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。

对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal 采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

使用CAS 锁实现(线程安全)

本文由SolarL投稿发布

漫画部分由小猿创作完成

https://blog.csdn.net/SolarL/article/details/88720516

今日话题

今天是小猿第一次尝试,用漫画的形式,跟大家展示内容,不知道你觉得怎么样呢?每天文末的话题讨论打卡,就是希望大家多交流,每个人都有在公众号发言的权力!希望你和我一起在这里成长!

点击「写留言」分享你的看法吧~

(0)

相关推荐

  • 设计模式:单例模式 (关于饿汉式和懒汉式)

    定义 单例模式是比较常见的一种设计模式,目的是保证一个类只能有一个实例,而且自行实例化并向整个系统提供这个实例,避免频繁创建对象,节约内存. 单例模式的应用场景很多, 比如我们电脑的操作系统的回收站就 ...

  • java常见设计模式之---单例模式

    java常见设计模式之---单例模式 1.单例模式简介 应用场景举例 2.单例模式的特点 3.单例模式和静态类 4.单例模式的经典实现 饿汉式单例(典型实现) 饿汉式-静态代码块 懒汉式单例创建,五种 ...

  • 单例-怎么用单例

    单例的实现 在实现一个单例时,需要从如下角度来考虑单例的实现是否合理: 1.不应该提供创建多个实例的接口.主要是两部分内容,分别是要将构造函数设为private属性,防止在别处通过new创建实例:在创 ...

  • 设计模式笔记(一):Singleton 设计模式

    今天开始学习设计模式,借此机会学习并整理学习笔记. 设计模式是一门不区分语言的课程,什么样的编程语言都可以用到设计模式.如果说java语法规则比作武功招式的话,那么设计模式就是心法. 设计模式共有23 ...

  • 23种设计模式入门 -- 单例模式

    单例模式:采用一定的方法,使得软件运行中,对于某个类只能存在一个实例对象,并且该类只能提供一个取得实例的方法. 分类: 饿汉式 静态常量方式 静态代码块方式 懒汉式 普通方式,线程不安全 同步方法方式 ...

  • 单例模式的八种写法

    单例模式作为日常开发中最常用的设计模式之一,是最基础的设计模式,也是最需要熟练掌握的设计模式.单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点.那么你知道单例模式有多少种实现方式 ...

  • Java设计模式之单例模式

    单例模式,是特别常见的一种设计模式,因此我们有必要对它的概念和几种常见的写法非常了解,而且这也是面试中常问的知识点. 所谓单例模式,就是所有的请求都用一个对象来处理,如我们常用的Spring默认就是单 ...

  • 收藏|多图详解5种常见跟骨骨折分型

    一.Sanders分型 此分型基于冠状位和轴位CT表现,在冠状面上选择跟骨后距下关节面最宽处,从外向内有两条线将其分为相等的三等部分,分别由A.B代表等分点,距下后关节面和载距突之间为C点,跟骨后距下 ...

  • 多图详解5种常见跟骨骨折分型

    一.Sanders分型 此分型基于冠状位和轴位CT表现,在冠状面上选择跟骨后距下关节面最宽处,从外向内有两条线将其分为相等的三等部分,分别由A.B代表等分点,距下后关节面和载距突之间为C点,跟骨后距下 ...

  • 行家详解糯种翡翠是如何细致分类的,搞明白这个才能玩好翡翠

    很多翠友都知道翡翠的种有玻璃种.冰种.糯种.豆种和瓷种. 但是我们在市场上购买翡翠的时候却发现,玻璃种的非常少见,冰种的也基本上是一些小的挂件. 我们在市场上看到的翡翠90%都是糯种. 虽然都是糯种, ...

  • 美国癌症研究所​:详解26种真正的抗癌食物!(2021更新)

    很多人认为一些食物可以对抗癌症,网络上也有各种各样的抗癌食品信息,这其中也包含大量的虚假信息,在寻求希望的同时也有可能上当受骗,浪费金钱.那么真的有抗癌食物吗? 美国癌症研究所是癌症预防研究和教育的全 ...

  • 教你在家轻松蒸馒头花卷,详解4种花卷手法,做法简单,一学就会

    教你在家轻松蒸馒头花卷,详解4种花卷手法,做法简单,一学就会.作为北方人,一般都离不开面食,馒头花卷烙饼和面条,几乎家家户户都离不开.很多人对于蒸馒头或者包子花卷之类的发酵面食或多或少都会碰到一些问题 ...

  • 香料大全带图详解(72种)

    香料是指在烹饪中所用到的香辛味调味品,它们有的含有多种芳香类的物质,有的带有典型的滋味或香气,故在烹饪中运用十分广泛. 1.八角 味道甘甜,内含有挥发油,有强烈而特殊的香气,是卤料的必需品.也常用于制 ...

  • 应粉丝要求,详解三种立领的出样技术!做法简单,成品时尚!

    应粉丝要求,详解三种立领的出样技术!做法简单,成品时尚!

  • 航拍初学者必备,详解15种无人机航拍操控技术

    近几年来,随着无人机航拍在影视制作中的迅猛发展,这种便捷的航拍方式极大地突破了传统意义上人们对航拍需求的奢望,使得电视制作中航拍画面变得丰富多彩且日臻完美.然而,由于无人机在影视航拍领域尚无较为系统的 ...

  • 干货:动图详解15种绳子打结方法及攀岩常用到18种结绳方法 果断收藏

    崖壁攀登中有多种保护方法,该视频仅是其中一种,供训练使用.战时是否合适部队使用,见仁见智. 详细图解15种常用绳子打结方法 <The Century Guide To Knots>一书的开 ...