【设计模式】:单例设计模式深究
单例设计模式深究
文章目录
- 单例设计模式深究
- 饿汉式:
- 懒汉式:
- 懒汉式线程不安全解决:(DCL双重检锁 + volatile )
饿汉式:
/*** @ClassName EHanShi* @Description 单例 ===》饿汉式 * :造成资源浪费* @Author 86188* @DAte 2022/3/8**/
public class EHanShi {private static EHanShi eHanShi = new EHanShi ();public EHanShi () {}public static EHanShi getInstance(){return eHanShi;}
}
懒汉式:
/*** @ClassName EHanShi* @Description 单例 ===》饿汉式 * :造成资源浪费* @Author 86188* @DAte 2022/3/8**/
public class EHanShi {private static EHanShi eHanShi = new EHanShi ();public EHanShi () {}public static EHanShi getInstance(){return eHanShi;}
}
当在单线程模式下: 结果是可行的:
但是在多线程的形况下:
//多线程public static void main ( String[] args ) {// System.out.println (LanMan.getInstance ()==LanMan.getInstance ());for (int i = 0 ; i < 10 ; i++) {new Thread (()->{LanMan.getInstance ();},String.valueOf (i)).start ();}}
结果:(创建了多个对象 不符合单例)
总结:饿汉式 早早创建资源 ,线程安全
懒汉式 线程不安全
懒汉式线程不安全解决:(DCL双重检锁 + volatile )
当然可以加 sychronzied 关键字保证线程安全!当然也有别的方法(DCL:double check Lock 双重检索机制)!!!!
public static LanMan getInstance(){//双重检锁 if (lanMan == null) {synchronized (LanMan.class){if (lanMan == null) {lanMan = new LanMan (); //不是原子性,可能发生指令重排 /** 1.创建空间* 2.初始化对象* 3.指向空间* */}}}return lanMan;}
结果:
但是 DCL 不一定是安全的!! 会发生指令重排!加volatile后可以禁止指令重牌!
private static volatile LanMan lanMan = null;
最终版懒汉式:
public class LanMan {private static volatile LanMan lanMan = null;private LanMan(){System.out.println (Thread.currentThread ().getName ()+"创建了对象");}public static LanMan getInstance(){//双重检锁if (lanMan == null) {synchronized (LanMan.class){if (lanMan == null) {lanMan = new LanMan (); //不是原子性,可能发生指令重排/** 1.创建空间* 2.初始化对象* 3.指向空间* */}}}return lanMan;}
【设计模式】:单例设计模式深究相关推荐
- 面试官最喜欢考的设计模式---单例设计模式
一.讲在前面的废话 笔者曾经多次面试都遇到了这个问题,请你说一下软件的设计模式,一般我们都会把23种模式例举几个出来,如果没有说错,你一定会列举单例设计模式,这样的话你就中了面试官的圈套了.接下来的一 ...
- Java设计模式——单例设计模式/权限修饰符的使用
1. 单例模式含义 所谓的单例设计模式,就是采取一定的方法保证整个软件系统中,某个类只能存在一个对象实例. 单例设计模式 2. 单例设计模式的两种实现方法 饿汉式:不管是否需要该实例,我事先就把该实例 ...
- Java设计模式—单例设计模式(Singleton Pattern)完全解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- Java设计模式-单例设计模式
文章目录 前言 一.什么是设计模式? 二.单例模式介绍 1.单例模式的目的 2.单例模式的定义 单例模式的设计与实现要点: 3.单例模式的两种实现方式 (一)饿汉式创建 (二)懒汉式创建 4.单例模式 ...
- java设计模式--单例设计模式
package com.henu; /*饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了.而懒汉比较懒,只有当调用getInstance的时候,才回去初始化 ...
- python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件
1.单例设计模式 单例设计模式就是为对象在内存中分配空间的时候,永远只会返回一个唯一的固定的内存空间.这样就能保证在内存中这个类的对象只有唯一的一份,这个就叫做单例.(为对象分配空间使用的是内置方法_ ...
- 第三次学JAVA再学不好就吃翔(part117)--单例设计模式
学习笔记,仅供参考,有错必纠 文章目录 多线程 单例设计模式 饿汉式 懒汉式 第三种格式 Timer类 线程的五种状态 多线程 单例设计模式 单例设计模式,即保证类在内存中只有一个对象,如何保证类在内 ...
- 【秒懂设计模式】单例设计模式
秒懂设计模式--单例设计模式 (三)单例设计模式 1.先解释一下,什么是单例模式呢? 在Java中是这样定义的:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 显然从 ...
- C++11标准下的单例设计模式
单例设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 为什么会产生设计模式这样的东西呢? 使用设计模式的目的:为了代码可重用性.让代码 ...
- 【Java】day9--main方法、单例设计模式、继承、方法重写部分知识点总结
(一)main方法 jvm调用main方法,jvm也是一个程序 main方法详解: public:公共 保证该类在任何情况下,jvm都对其方法可见. stat ...
最新文章
- GDAL中GDALDataset::RasterIO分块读取的实现
- NSIS安装制作基础教程
- Modelsim仿真时不能编译`include文件解决办法
- ActiveX中添加对话框并显示
- 引用可以是void类型吗?
- I/O复用函数的使用——select
- Windows: 在系统启动时运行程序、定时计划任务、定时关机
- linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构
- 文字框架拼接(洛谷P4327题题解,Java语言描述)
- 信息学奥赛C++语言: 验证子串
- alibaba 实体转json_JAVA中使用alibaba fastjson实现JSONObject、Object、Json字符串的转换...
- 随机变量概率分布函数汇总-离散型分布+连续型分布
- 射影几何----齐次坐标下的三点共线和非齐次坐标下的三点共线是等价的
- python云计算1
- 渗透测试常见漏洞描述及修复建议
- 使用tensorboard时http://localhost:6006打不开或desktop-2a1fhsu 已拒绝连接
- 基于Multisim的AM信号包络检波器
- 使用弹簧启动和 JPA 测试乐观锁定处理
- 使用AWS 管理控制台和 AWS CLI创建EKS集群
- 小学网管中心计算机使用规定,中小学网管中心管理制度
热门文章
- 毫秒数转换为时间计时天数
- FastDFS搭建图片服务器
- python的logo的代码_简单几步,100行代码用Python画一个蝙蝠侠的logo
- MariaDB数据存储引擎的选择
- android tv盒子哪个好用,电视盒子什么牌子好?内行人都选这五款好用又不贵的机型...
- 魔兽按键精灵 V2.0(修正1)
- HDU 5745 La Vie en rose(水~)
- laravel框架基础知识
- 检测本地连接并自动连接宽带连接.cmd
- 乔治城大学计算机科学专业,乔治城大学计算机系