单例对象 (Singleton)设计模式
单例的目的是为了保证运行时Singleton类只有唯一的一个实例,用于一些较大开销的操作。
饿汉式(没有线程安全问题):
‘
由于使用static关键字进行了修饰,只能获取到一个对象,从而达到了单例,并且在Singleton类初始化的时候就创建了对象,加载到了内存。
问题:在没有使用这个对象的情况下就加载到内存是一种很大的浪费。
针对这种情况,有一种新的思想提出——延迟加载,也就是所谓的懒汉式。
懒汉式(存在线程安全问题):

这种方法在调用Singleton.getInstance()时才会创建对象,起到了延迟加载的作用。
问题:这样的写法在多个线程同时运行时,很有可能会产生多个实例对象,导致线程安全问题。
使用同步的方法解决这个问题,加上synchronized关键字,代码如下:

使用同步的代价是会在一定程度上降低程序的并发度,并且锁定整个方法很消耗资源,原本采用延迟加载是为了节省资源,
所以,降低锁的细粒度,代码如下:

但是这样的写法线程还是不安全,因为两个线程可以同时进入if语句,线程A实例化对象返回之后,线程B不用经过判断
能再实例化对象,并且返回另一个对象。为了解决这个问题,引入了臭名昭著的双重锁机制:

上面的代码看似解决了线程安全问题,也起到了延迟加载的作用,但是双重锁机制是没有办法工作的,有一篇文章解释的非常
深刻:http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
在参考了一些资料,我认为双重锁机制之所以不能正常运行是因为,在new对象的时候,是有三个步骤的:分配内存空间,
初始化对象,然后将内存地址赋值给变量;在这么三个步骤中,极有可能会在操作上进行重排序,在重排序的情况下,还没有初始化
对象,先将内存地址赋值给了变量(这种情况是可能存在的),当线程B进入时,发现变量不为null,就会直接返回这个实例,然而此时
可能拿到的是还没有初始化完成的对象。所以双重锁机制是不提倡使用的。
在http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl文章中有提出,在新的内存模型下,实例字段使用volatile可以解
决双重锁检查的问题,因为在新的内存模型下,volatile禁止了一些重排序,但是,同时,使用volatile的性能开销也有所上升。
所以又提出一种新的模式——Initialization on Demand Holder. 这种方法使用内部类来做到延迟加载对象,在初始化这个内部类的时候,
JLS(Java Language Sepcification)会保证这个类的线程安全。代码如下:

单例对象 (Singleton)设计模式的更多相关文章
- 小菜学习设计模式(二)—单例(Singleton)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- 设计模式的征途—1.单例(Singleton)模式
单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...
- Spring IoC 中的(Singleton)单例对象创建过程探索
前言 之前将spring framework 源码导入了idea,后来折腾调试了一下,于是研究了一下最简单的singleton对象在spring中是如何创建的.这里所谓的简单,就是指无属性注入,无复杂 ...
- 【java设计模式】之 单例(Singleton)模式
1. 单例模式的定义 单例模式(Singleton Pattern)是一个比較简单的模式.其原始定义例如以下:Ensure a class has only one instance, and pro ...
- 23种设计模式之单例(Singleton Pattern)
单例 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例(eg:应对一些特殊情况,比如数据库连接池(内置了资源) 全局唯一号码生成器),才能确保它们的逻辑正确性.以及良好的效率 ...
- java设计模式——单例(Singleton)模式
在某些场景,你需要找到一个承担职责的对象,并且这个对象是他所属类的唯一实例.此时可以使用单例模式. 单例模式的意图是为了确保一个类有且仅有一个实例,并为他提供一个全局的访问点.创建一个担当独一无二角色 ...
- Singleton单例对象的使用
namespace www{ public abstract class SingletonManager<T> : ISingletonManager where T : class, ...
- ① 设计模式的艺术-01.单例(Singleton)模式
单例模式为何要出现 在工作过程中,发现所有可以使用单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的. 如果我们不将这个类控制成单例的结构,应用中 ...
- 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5) 博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...
随机推荐
- python 字典添加数据
dzkuaa={}#类似{"张三":2,"李四":3} for i in range(23): ming=bj[i] if dzkuaa.get(ming)== ...
- 第 1 题:HTML 和 HTML5 有什么区别?
概念 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准 文档类型声明 HTML <!DOCTYPE html PUBLIC "-//W3C//DTD HTML ...
- 大疆M3508、M2006必备CAN总线知识与配置方法
使用大疆M3508.M2006的CAN总线知识与配置方法 目录 使用大疆M3508.M2006的CAN总线知识与配置方法 前言: 0x00 需要额外的CAN收发器!!! 0x01 硬件层面分析 为什么 ...
- 手写系列-实现一个铂金段位的 React
一.前言 本文基于 https://pomb.us/build-your-own-react/ 实现简单版 React. 本文学习思路来自 卡颂-b站-React源码,你在第几层. 模拟的版本为 Re ...
- PyVista:一款Python的三维可视化软件
技术背景 三维可视化是一项在工业领域中非常重要的技术,而Python中最热门的可视化工具matplotlib和plotly,更加倾向于在数据领域的可视化,用于展现数据的结果.类似的还有百度的pyech ...
- PAT乙级:1061 判断题 (15分)
PAT乙级:1061 判断题 (15分) 题干 判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 ...
- 一次搞懂JavaScript对象
索引 目录 索引 1. 对象与类 2.对象使用 2.1 语法 2.2 属性 3.对象特性 4.对象的创建 4.1 字面量 4.2 工厂函数 4.3 构造函数 4.4 class类 4.5 对象与单例模 ...
- CF459E-DP
CF459E-DP 核心代码15行 思路 观察数据范围,我们建m层分层图跑最短路想到DP. DP最大的特点就是无后效性.那么我们这一题哪个条件无后效性呢? 发现DP值一定从边权小于当前点的位置转移而来 ...
- [考试总结]noip18
发现之前咕掉了这个考试的总结. 今天就把它给补上. 这也是一个炸裂的一场 开局以为 \(T1\) 可做,然而事实证明我又错了... 莽了一个随机化上去,轻松过了所有样例... 以为稳了 然而挂掉了.. ...
- tomcat与springmvc 结合 之---第18篇 StandContext容器和SpringMVC的监听器的模型
writedby张艳涛 如何使用tomcat的监听器 public class BootStrap_ex06 { public static void main(String[] args) { Ht ...