之前我写过 单例模式中的饿汉模式和懒汉模式

他们虽然都能实现单例模式 但是优缺点很明显

饿汉模式:不能懒加载(类加载就会被实例化),消耗很大,在并发情况下安全性很高。

懒汉模式:能实现懒加载,但是在并发情况下安全性不是很高。虽然一步一步的优化,安全性得到了保证,但是却使用了synchronized 对性能有所影响。

今天记录一下 Holder 模式

它结合了饿汉模式 安全性,也结合了懒汉模式懒加载。不会使用synchronized 所以性能也有所保证。

代码:Holder 模式与其说是 饿汉模式和懒汉模式相结合,不如说是思维的更高一层的表现。23种设计模式是(短期)不会变的,但是思想会变。

Holder 模式就是将我们要构造的实例交于其内部类进行实例。

private :表明不能被他人调用,

static: 静态的内部类 不会率先被加载,只有主类被调用的时候被加载(解决了懒加载问题),并且

private static HolderSingleton instance=new HolderSingleton(); 只会加载一次。
/*** Holder模式*/
public class HolderSingleton {private HolderSingleton(){}/*** 私有的 静态 内部类     类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。 */private static class HolderDemo{private static HolderSingleton instance=new HolderSingleton();}public static HolderSingleton getInstance(){return HolderDemo.instance;}/*** 测试* @param args*/public static void main(String[] args) {for(int i=0;i<20;i++){new Thread(()->{System.out.println(HolderSingleton.getInstance());}).start();}}}

测试结果:

com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4Process finished with exit code 0

其实很想聊聊 static 机制的, 发现自己也是懵懵懂懂,待到以后仔细研究一下在另外写一篇关于 static的文章吧。

之所以说 静态的内部类会在主类调用的时候才会被加载,也是我看别人这没说(很多人也是这没说)。以后真正了解了static 才敢保证正确与否,不过此种方式确实刷新了我的认识

转载于:https://www.cnblogs.com/zhangzhonghui/p/11463250.html

单例模式 之 单例模式——Holder相关推荐

  1. C++单例模式:单例模式遇到多线程

    单例模式介绍 单例模式主要有2中形式,一种是饿汉式,一种是懒汉式. 饿汉式:程序一加载单例模式就已经创建了,也就很饥饿嘛.因为是静态属性进行单例初始化,所以优点是线程是安全的,缺点是无论用户是否使用单 ...

  2. 什么是单例模式以及单例模式的几种实现

    什么是单例模式? 单例模式,是一种常用的软件设计模式.通过单例模式可以保证系统中,应用该模式的这个类只有一个实例,即一个类只有一个对象实例.下面讲讲他的四种实现. 1. 饿汉式单例设计模式 饿汉单例设 ...

  3. 【设计模式】单例模式是什么?如何实现单例模式?单例模式常见问题?

    目录 1. 单例模式 1. 单例模式的三要素 2. 优点 3. 单例的实现方式(思路:思考一下Java创建对象的几种方式?好像解题思路也不对...基本都是通过new出来的) 1. 饿汉模式单例(在类加 ...

  4. Android中的单例模式(java单例模式详解,Glide,EventBus,LayoutInfalter的源码单例模式详解)

    一.单例模式 (1)单例模式介绍和定义 ​ 大概意思是保证一个类在任何时候都只有一个实例在内存里,以static形式提供整个项目的访问.在Android系统中常用的地方有:创建一个SQLiteOpen ...

  5. 单例模式(DCL、holder等)

    单利模式 单利模式简单的来说由两部分组成: 只实例化一次 提供返回这个实例的方法 单利模式的好坏在于线程安全.性能(效率).懒加载这三个属性的好坏 那怎么实现单利模式呢?也就是怎么才能保证一直只有一个 ...

  6. python最简单单例模式_Python单例模式的4种实现方法 | 学步园

    Python单例模式的4种实现方法: 方法1: 实现__new__方法,并将一个类的实例绑定到类变量_instance上.如果cls._instace为None,说明该类还未实例化过,实例化该类,并返 ...

  7. java bean 单例模式_单例模式 - Beans_bag - 博客园

    1.单例模式的简介 定义 保证每个类仅有一个实例,并给外部提供一个访问它的全局访问点. 思路 如果一个类能够被创建多个实例,那么,这个类的构造方法肯定是公开的,外部通过此类的构造方法可以创建多个类的实 ...

  8. python创建单例模式_Python单例模式的四种创建方式实例解析

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  9. c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...

    单例模式,多线程单例,双重锁定单例,工厂单例创建上下文. 单例子模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个 ...

最新文章

  1. python官方手册-Python3 中文手册
  2. jQuery中$(document).ready()和window.onload的区别
  3. 【S操作】更新网络视频下载方法详细步骤,m3u8格式文件视频文件下载方法,gohls使用详细步骤...
  4. 单个接口添加超时时间_SpringBoot使用Guava令牌桶对接口限流
  5. html5波浪线条,HTML5 svg炫酷波浪线条动画插件
  6. python在职场的用处大吗_Python未来发展怎么样,未来办公是否都需要精通Python?...
  7. C++基础学习8:类的定义(class)
  8. SpringBoot + MyBatis 之 Hello World
  9. spark-shell 基本用法
  10. 【手势识别】基于matlab GUI肤色手势识别【含Matlab源码 716期】
  11. APP推广的八大“邪恶”方法?做好产品才是王道!
  12. spark 部署安装
  13. ASROCK X399 PROFESSIONAL GAMING R1.02(70-MXB5Q0-A01)华擎点位图
  14. 无人机通信电台--XBee-PRO 900HP (S3B)
  15. 人工智能如何改变人类生活
  16. js怎样向html中添加内容,使用js向网页中写入html内容
  17. Java Web-----轮播图的实现
  18. area 估算函数(simpson)
  19. 小白学渗透——渗透测试基本流程
  20. Latex 打勾 打叉

热门文章

  1. Filter的细节三学习笔记
  2. 那些年追过的......写过的技术博客
  3. 13.Django之url路由系统初探(一)
  4. POJ 2065 SETI [高斯消元同余]
  5. (十二)Flask 学习 —— 换装
  6. 10 分钟入门 AST 代码优化与修改
  7. while loading shared libraries: libmysqlclient....
  8. ELNET服务被我删了,如何安装?
  9. C++实现删除字符串中所有重复出现的字符
  10. 少一些计较多_人与人之间最舒服的关系:低期待,少索取,不苛求