设计模式第一篇---懒汉模式
1.懒汉模式:延迟加载,只有在真正使用的时候,才开始实例化。1)线程安全问题 2)double check 加锁优化3)编译器(JIT).CPU有可能对指令进行重排序,导致使用到尚未初始化的实例,可以通过添加volatile 关键字进行修饰,对于volatile修饰的字段,可以防止指令重排。
注意:volatile关键字
volatile:会禁止指令重排,什么是指令重排,重排序是指编译器和处理器为了优化程序性能而对指令序列进行排序的一种手段。比如JVM类加载的时候会将.java文件转换成.class文件,然后可以通过JIT技术(just in time即时编译技术,使用该技术能够加快java程序的执行速度),本来在JVM中类的加载是1、分配空间,2、初始化,3、引用赋值,我们可通过改变它加载的机制,将引用赋值这一步放到初始化的前面,这样就能在第二步就先将值赋予给要创建的对象,在另外一个线程进来之前就能判断到这个属性已经有值,但是这个时候如果对象还没有初始化,就会报空指针异常,volatile关键字就起到防止重排的作用。
public class LazySingletonTest {public static void main(String[] args) {new Thread( ()->{LazySingleton instance = LazySingleton.getInstance();System.out.println(instance);}).start();new Thread( ()->{LazySingleton instance = LazySingleton.getInstance();System.out.println(instance);}).start();} }class LazySingleton {/*** volatile 它会防止这个引用对应的空间不会重排序,防止重排序* 字节码* JIT, CPU JIT是just in time,即时编译技术。使用该技术,能够加速java程序的执行速度。 进行物理层面的优化* 1.分配空间* 2.初始化* 3.引用赋值*/private volatile static LazySingleton singleton;private LazySingleton(){}public static LazySingleton getInstance(){if(singleton == null){synchronized (LazySingleton.class){if (singleton == null){singleton = new LazySingleton();//字节码// JIT, CPU JIT是just in time,即时编译技术。使用该技术,能够加速java程序的执行速度。 进行物理层面的优化// 1.分配空间// 3.引用赋值(如果t1线程引用赋值了,t2线程进来发现singleton已经有值了,如果还没而有初始化,就会报空指针异常)// 2.初始化}}}return singleton;} }
设计模式第一篇---懒汉模式相关推荐
- 大聪明教你学Java设计模式 | 第一篇:单例模式 (懒汉模式和饿汉模式)
前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...
- 二十三种设计模式第二篇--工厂模式
上篇我们了解了6条设计模式的准则,我相信如果你想了解设计模式,那么你迈出的第一步,我会将上一篇文档里边的6大准则进行一篇有关的代码展示,当然这是题外话了,本篇我们将重点围绕工厂模式进行讲解,天哪,23 ...
- 设计模式——单例模式(懒汉模式,饿汉模式)
声明: 本博客参考C语言中文网和优秀博客总结得出: (1)C语言中文网链接 (2)优秀博客链接 单例模式的定义: 指一个类只有一个实例,且该类能自行创建这个实例的一种模式.例如,Windows 中只能 ...
- 从真实项目中抠出来的设计模式——第一篇:策略模式
有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个cs上万行代码这样场景是有发生, 当然这里也包括我...所以时间充裕一点之后就想重构一下,毕 ...
- 设计模式第一篇——简单工厂模式&类图
从今天开始,小菜决定记录下来自己学习设计模式的过程,并总结每天所学内容记录在博客中. 以编写计算器程序为例,有+,-,*,/--很多种运算,因此需要if,else或switch,case进行判断,当有 ...
- 从真实项目中抠出来的设计模式——第二篇:过滤器模式
一:实际场景介绍 我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动 ...
- DBCP使用BasicdataSource连接(两种单例模式-----饿汉和懒汉模式)
DBCP使用BasicDataSource连接 BasicDataSource实现DataSource的接口,可以进行简单的数据库连接 第一种:懒汉模式:顾名思义,"懒",只有在调 ...
- [设计模式篇]工厂模式和抽象工厂模式
最近在看Head First的Design Pattern,想想去年候捷来学校给我们讲Design Pattern,但当时水平太弱根本听不懂,今年想趁机再好好学一波,候捷反而不来了,哎,人生就是这样, ...
- 软件腐化的七个特征之僵化性和脆弱性(设计模式原则的反面) (《敏捷软件开发》读书总结第一篇)
文章目录 前言 僵化性(Rigidity) 原文 我的理解 脆弱性(Fragility) 原文 我的理解 前言 最近读Robert C. Martin(Bob大叔)的书<敏捷软件开发>,准 ...
- 单例模式的实现-懒汉模式【大话设计模式之爱你一万年:单例模式:我的女朋友只有你一个】
2.单例模式的实现-懒汉模式 视频学习地址 -- <大话设计模式之爱你一万年>:https://dwz.cn/wqO0MAy7 这一节我们先来看看一种实现模式,懒汉模式,这也是这么中实现 ...
最新文章
- Xmpp实现简单聊天系列 --- ②用户注册和登陆
- 如何设计一个牛逼的API接口
- aic bic mdl
- 插件式程序开发及其应用(C#)
- 恶补各种知识(操作系统篇)
- 腾讯拟全资收购搜狗,王小川:感谢认可,将认真讨论和衡量
- mysql的预准备语句_mysql – 将字符串插入到没有”的预准备语句中
- Java的getperiod_Java中的Period getYears()方法
- 3.6. Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota
- 【DevOps】做个愉快的DevOps之XenServer自动化管理(1)
- 内核流浪猫流浪狗宠物领养平台H5源码
- socket原理及实现
- Elasticsearch - unmapped_type容错【某个不存在的字段、查询某个没有默认值的字段】
- distinct效率更高还是group by效率更高?
- 【毕业设计】总结、展望及参考文献
- 紫罗兰永恒花园rust简谱_Sincerely钢琴谱_TRUE_紫罗兰永恒花园OP
- 开源项目 - 收藏集 - 掘金
- python常见几种设计模式
- Web工程师和设计师必须要知道的 iOS 8的十个变化
- iOS即时通讯进阶 - CocoaAsyncSocket源码解析(Connect篇)