Java设计模式--单例模式(代码详解懒汉、饿汉模式)
文章目录
- 设计模式-单例模式
- 懒汉模式
- 怎么解决线程安全问题?
- 1.使用双重校验锁
- 2.volatile 修饰实例对象,禁止指令重排序
- 线程安全的懒汉模式
- 饿汉模式
设计模式-单例模式
啥是单例模式?
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
1.在类中就创建实例,只创建一个实例
2.类外如果想要调用这个对象必须调用getInstance方法获取实例,好处是减少了创建对象、销毁对象的开销
3.获取实例只能获取到类提供的唯一实例
懒汉模式
解释一下懒汉,懒汉就是懒加载,在类加载的时候不会去创建实例,在第一次调用的时候才会创建实例。
public class Singleton {/**
* 以下是懒汉模式的代码
*/// 会产生线程安全问题,使用双重校验锁来保证安全private static Singleton instance = null;// 类加载过程不创建实例,实例设置为nullprivate Singleton() {}public static Singleton getInstance(){// 第一次调用该类才会创建实例if(instance==null){return instance = new Singleton();}// 其后每次调用实例都使用上面创建的实例return instance;}}
好处: 只有调用资源的时候才会创建实例,所以节约了资源。
坏处:懒汉模式会带来线程安全问题
如果多个线程同时获取实例,都是第一次获取,对执行 if(instance==null) 这个语句中的new实例,所以会创建出多个实例来。
怎么解决线程安全问题?
1.使用双重校验锁
第一个if(instance==null)
先判断实例是否存在,不存在再加锁
第二个if(instance==null)
当多线程都是第一次调用该对象的时候,只有一个线程能够进入,避免创建多个对象
public static Singleton getInstance(){if (instance==null) { // 先判断实例是否存在,不存在再加锁synchronized (Singleton.class) {if(instance==null){// 多线程情况下,只有一个能进入,避免创建多个对象。return instance = new Singleton();}}}return instance;}
2.volatile 修饰实例对象,禁止指令重排序
private volatile static Singleton instance = null;
Instance = new Singleton 这段代码其实分成三步骤
1.为 new Singleton 分配内存空间
2.初始化对象实例
3.Instance 变量指向这块内存地址
初始化时间有点慢,所以JVM指令重排,顺序变了1->3->2,在单线程的情况下没啥问题,但是如果在多线程的情况下,第一个线程进去了,执行了1-3,这个时候第二个线程一个 实例不为null,直接返回了没有初始化 的实例对象,明显产生了线程安全问题。
所以使用 volatile 禁止指令重排。
线程安全的懒汉模式
public class Singleton {/*** 以下是懒汉模式的代码*/// 会产生线程安全问题,使用双重校验锁来保证安全,使用volatile禁止指令重排序private volatile static Singleton instance = null;private Singleton() {}public static Singleton getInstance(){if (instance==null) {synchronized (Singleton.class) {if(instance==null){return instance = new Singleton();}}}return instance;}}
饿汉模式
理解饿汉,因为太饿了,所以一拿到东西就想吃,这里就是类加载的过程就直接创建唯一实例。
好处:没有线程安全问题
坏处:不像懒汉模式调用才创建实例,这个是类加载就创建实例,所以如果一直没调用,也得创建实例浪费资源。
public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}// 调用方法获取实例,只有读,所以没有线程安全问题public static Singleton getInstance(){return instance;}
}
Java设计模式--单例模式(代码详解懒汉、饿汉模式)相关推荐
- java中单例模式用法详解
最近空闲的时候回顾了一下常用的设计模式,其中单例模式是创建型模式中比较基础的一种设计模式,说起单例模式,想必大家并不模式,我们都知道的是,在单例模式下,能够保证一个类只有一个实例对象,就是说,外部访问 ...
- 蚁群算法(ACA)详细介绍(JAVA实现及代码详解)
文章目录 1.蚁群算法概要 什么是蚁群算法 蚁群算法的数学公式 蚂蚁从i城市到j城市的概率公式 信息素的释放公式 信息素的挥发公式 蚁群算法的框架 2.TSP描述(旅行商问题) 3.JAVA源代码实现 ...
- java设计模式之单例模式|单例模式之饿汉模式、懒汉模式、枚举方式|最详细的6种懒汉模式详解
目录 一.单例模式 二.饿汉模式和懒汉模式 1.饿汉模式,线程安全 2.懒汉模式 懒汉模式1,线程不安全(不常用) 懒汉模式2,线程安全(不常用) 懒汉模式3,线程安全,双重校验(不常用) 懒汉模式4 ...
- java编程数据溢出问题_Java数据溢出代码详解
Java数据溢出代码详解 发布时间:2020-10-05 15:08:31 来源:脚本之家 阅读:103 作者:Pony小马 java是一门相对安全的语言,那么数据溢出时它是如何处理的呢? 看一段代码 ...
- 单例模式 之 单例模式——饿汉模式
饿汉模式特点:见名知意,"他"很饿,迫切需要找到吃的... 所以 饿汉模式需要 第一时间 "找到吃的"(构建对象). 如下代码: 1 /** 2 * 饿汉模式 ...
- C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)
C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...
- 【Java】Java中的设计模式的介绍以及代码详解
一.什么是设计模式? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误 总结出来的. 对问题行之有效地解决方式,是一种设计 ...
- 大聪明教你学Java设计模式 | 第一篇:单例模式 (懒汉模式和饿汉模式)
前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...
- Java高并发编程详解系列-7种单例模式
引言 在之前的文章中从技术以及源代码的层面上分析了关于Java高并发的解决方式.这篇博客主要介绍关于单例设计模式.关于单例设计模式大家应该不会陌生,作为GoF23中设计模式中最为基础的设计模式,实现起 ...
- 【设计模式】之单例模式中的饿汉模式和懒汉模式
本文内容:什么是单例模式,单例的作用,饿汉模式,懒汉模式的安全与非安全的实现,饿汉模式与懒汉模式的区别. 什么是单例模式? 单例模式:保证一个类,仅有一个实例.提供一个访问它的全局访问点. 单例的作用 ...
最新文章
- 手把手 | Python代码和贝叶斯理论告诉你,谁是最好的棒球选手
- .a 文件 和 so 文件
- linux基础知识复习
- 14.理解copy_if算法的正确实现
- 批处理文件总结(三)
- Java图形界面设计——substance皮肤
- 火狐浏览器表单不跳转_坑爹火狐浏览器会记录表单数据,导致服务器控件点击事件出bug...
- python抓取websocket_python--websocket数据解析
- 苹果Mac白噪音软件:Noise Machine
- [AGC003F] Fraction of Fractal 矩阵快速幂
- java spring定时器_Spring定时器的两种实现方式
- 鸟哥Linux私房菜-读后感想
- Django项目定时任务(django-crontab)
- 画春天的景色计算机教案,最新《画春天》教案
- 用python画靶盘九个_““python程序设计:画一个射箭运动所用的箭靶.从小到大分别黄,红,蓝,黑,白色的同...
- HTML5期末大作业:游戏网页网站设计——CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript
- 算法题:1到4位编码推下标
- python对seo有什么用_pythonseo-python对于做SEO主要有什么作用
- excel数据平均分配给多人_excel数据拆分:将单列拆分成多列的几种方法
- 通过jmeter进行用户并发(vu/s)测试