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

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

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

懒汉模式:能实现懒加载,但是在并发情况下安全性不是很高。虽然一步一步的优化,安全性得到了保证,但是却使用了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@616831d4 Process finished with exit code 0

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

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

单例模式 之 单例模式——Holder的更多相关文章

  1. 单例模式-Lazy initialization holder class模式

    这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙地同时实现了延迟加载和线程安全. 1.相应的基础知识 什么是类级内部类? 简单点说,类级内部类指的是,有static修饰的成员式内 ...

  2. 【单例模式】单例模式 & GCD单例模式 & 将封装单例模式到宏

    懒汉式单例模式 下面的代码块, 基本是单例模式的完整版本了. 可扩展的地方,可以在init方法中作扩展. // static 在全局变量的作用域仅限于当前文件内部 static id _instanc ...

  3. JS中的单例模式及单例模式原型类的实现

    单例模式 单例模式的定义: 保证一个类只有一个实例,并提供一个访问它的全局访问点 通过一个简单的例子来了解单例模式的作用: class Div { constructor() { return doc ...

  4. 啰嗦的 java,简洁的 lombok —— lombok 的使用及简单实现单例模式注解

    lombok 是什么? lombok 是一个非常神奇的 java 类库,会利用注解自动生成 java Bean 中烦人的 Getter.Setting,还能自动生成 logger.ToString.H ...

  5. Java常见设计模式之单例模式

         1.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...

  6. Java与设计模式之单例模式(上)六种实现方式

           阎宏博士在<JAVA与模式>中是这样描述单例模式的:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.      ...

  7. java基础之----23种设计模式(单例模式)

    概述 提到单例模式,我们并不陌生,而且面试中也常常会问单例模式相关的问题,接下来就谈谈单例模式,这篇文章会回答如下几个问题: 什么是单例模式? 单例模式有几种实现方式,以及各种实现方式的优劣? 单例模 ...

  8. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  9. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

随机推荐

  1. [深度学习] pytorch学习笔记(3)(visdom可视化、正则化、动量、学习率衰减、BN)

    一.visdom可视化工具 安装:pip install visdom 启动:命令行直接运行visdom 打开WEB:在浏览器使用http://localhost:8097打开visdom界面 二.使 ...

  2. js几种加密方法

    1.base64加密 它的github地址:https://github.com/dankogai/js-base64 <!DOCTYPE HTML> <html> <h ...

  3. Unity3D_(API)Random随机数

    Unity随机数Random官方文档: 传送门 一.生成一个随机数 二.Random.InitState()生成伪随机数 三.官方文档中常用的方法 创建一个Cube用来挂载Random_Gary.cs ...

  4. Mongo rs

    概念 rs中存储了每一次对mongo数据库的CUD操作,对rs的大小进行resize. 主要有两种方法: 在未开启过rs的情况下,修改配置文件 已使用rs一段时间后,发现rs太大,重新进行大小配置 启 ...

  5. IDM非补丁破解方法

    参考 http://tieba.baidu.com/p/3878377959 备份文章 在网络和共享中心中打开防火墙 高级设置->出站规则->新建规则 打开新建规则向导. 程序-> ...

  6. linux输出与查看的几种方式

    输出的几种方式:echo/ tee echo "postgres install Failed !!!!!!" | tee -a "$Install_log"# ...

  7. python3笔记十八:python列表元组字典集合文件操作

    一:学习内容 列表元组字典集合文件操作 二:列表元组字典集合文件操作 代码: import pickle  #数据持久性模块 #封装的方法def OptionData(data,path):    # ...

  8. 数据库-MongoDb

    *本文总结下使用Mongodb遇到的问题: 1. 安装完MongoDb后先启动服务端,然后再启动客户端: 直接上图: 注意点:mongod.exe :是用来连接到mongo数据库服务器的,即服务器端. ...

  9. Day1_Python基础一

    一.基本认识 1.计算机基础 CPU:计算 内存:缓存 硬盘:存储 操作系统:硬件与软件的桥梁 应用程序:应用的平台 2.Python的历史 1989年龟叔,追求清晰.简单.优美的原则. 主要领域:云 ...

  10. IMDB Classification on Keras

    IMDB Classification on Keras In the book of Deep Learning with Python, there is an example of IMDB m ...