单例模式 之 单例模式——Holder
之前我写过 单例模式中的饿汉模式和懒汉模式
他们虽然都能实现单例模式 但是优缺点很明显
饿汉模式:不能懒加载(类加载就会被实例化),消耗很大,在并发情况下安全性很高。
懒汉模式:能实现懒加载,但是在并发情况下安全性不是很高。虽然一步一步的优化,安全性得到了保证,但是却使用了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的更多相关文章
- 单例模式-Lazy initialization holder class模式
这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙地同时实现了延迟加载和线程安全. 1.相应的基础知识 什么是类级内部类? 简单点说,类级内部类指的是,有static修饰的成员式内 ...
- 【单例模式】单例模式 & GCD单例模式 & 将封装单例模式到宏
懒汉式单例模式 下面的代码块, 基本是单例模式的完整版本了. 可扩展的地方,可以在init方法中作扩展. // static 在全局变量的作用域仅限于当前文件内部 static id _instanc ...
- JS中的单例模式及单例模式原型类的实现
单例模式 单例模式的定义: 保证一个类只有一个实例,并提供一个访问它的全局访问点 通过一个简单的例子来了解单例模式的作用: class Div { constructor() { return doc ...
- 啰嗦的 java,简洁的 lombok —— lombok 的使用及简单实现单例模式注解
lombok 是什么? lombok 是一个非常神奇的 java 类库,会利用注解自动生成 java Bean 中烦人的 Getter.Setting,还能自动生成 logger.ToString.H ...
- Java常见设计模式之单例模式
1.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...
- Java与设计模式之单例模式(上)六种实现方式
阎宏博士在<JAVA与模式>中是这样描述单例模式的:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. ...
- java基础之----23种设计模式(单例模式)
概述 提到单例模式,我们并不陌生,而且面试中也常常会问单例模式相关的问题,接下来就谈谈单例模式,这篇文章会回答如下几个问题: 什么是单例模式? 单例模式有几种实现方式,以及各种实现方式的优劣? 单例模 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
随机推荐
- 5.反生成url
# url(r"^all/(?P<article_type_id>\d+)$", home.index,name="index" ), # 在htm ...
- ReactJS 结合 antd-mobile 开发 h5 应用基本配置
在 ReactJS 较为初级的使用 antd-mobile 使用时候直接加载 node_modules 文件中的相关 CSS,这个使用方法效率低:更高明的方法则按需加载,需要设置如下: 在 packa ...
- Luogu P4707 重返现世 (拓展Min-Max容斥、DP)
题目链接 https://www.luogu.org/problem/P4707 题解 最近被神仙题八连爆了-- 首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的--Kth Min-Ma ...
- Spring Boot教程(二十九)使用JdbcTemplate操作数据库
使用JdbcTemplate操作数据库 Spring的JdbcTemplate是自动配置的,你可以直接使用@Autowired来注入到你自己的bean中来使用. 举例:我们在创建User表,包含属性n ...
- JavaScript 函数相关属性
1.name 既函数名 function test(){ console.log("Haha") }; console.log(test.name)//test 2.length属 ...
- shell脚本之for 列表循环
作用:对列表进行循环处理 语法: for var in list do commands done 案例: 1.读取列表中的值 2.读取列表中的复杂值 异常案例:未显示出“'”单引号,使语句出现异常 ...
- ImportError: bad magic number in: b'\x03\xf3\r\n'
解决办法:删除项目中所有的 .pyc 文件.
- 源码编译apache出错
报错信息如下 exports.c:1572: error: redefinition of `ap_hack_apr_allocator_create' exports.c:177: error: ` ...
- 转 Cookie、Session
https://www.cnblogs.com/liwenzhou/p/8343243.html Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况 ...
- leetcode 33搜索旋转排序数组
暴力解法:O(n) 想办法用二分查找Ologn