单例模式

  • 单例设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

    这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

应用实例

  • Windows是多进程多线程的,通过唯一的实例来操作一个文件,避免地出现多个进程或线程同时操作一个文件的现象。

  • 一些设备管理器常常设计为单例模式(如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件)。

使用场景

  • 要求生产唯一序列号。

  • WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

  • 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

单例实现

  • 方式一

方式二

  • 改进了方式一的缺点,但同时带来了线程安全问题

  • 假设有两个线程,线程1到第9行判断完实例是否为空时(还没到new一个实例),线程2也到了判断实例是否为空的位置,

    因为线程1还没创建实例,INSTANCE仍为空,线程2创建完一个实例后,线程1继续执行也创建了一个实例。

方式三

  • 通过synchronized加锁,解决方式二的线程安全问题,但也带来了效率下降。

  • 通过加锁,锁定了Mgr03.class对象,因此输出的hashcode是相同的。

方式四

  • 双重校验锁,完美的单例模式写法之一。

  • 如果只有外层判断,就会出现线程安全问题(如同方式二)。

方式五

  • 静态内部类方式,解决了方式一的问题,达到了按需初始化的目的,是完美的单例模式之一。

方式六

  • 通过枚举实现单例

public class Mgr05 {
private Mgr05() {};
//类Mgr05加载时,内部类不会加载
private static class Mgr05Holder{
private final static Mgr05 INSTANCE=new Mgr05();
}
//调用getInstance(),类Mgr05Holder加载
public static Mgr05 getInstance() {return Mgr05Holder.INSTANCE;};
public static void main(String[] args) {
for(int i=0;i<200;i++) {
new Thread(()->{
System.out.println(Mgr05.getInstance().hashCode());
}).start();
}
}
}

public class Mgr04 {
private static volatile Mgr04 INSTANCE;
private Mgr04() {};
public static synchronized Mgr04 getInstance() {
if(INSTANCE==null) {//双重校验锁
synchronized (Mgr04.class) {
if(INSTANCE==null) {
try {
Thread.sleep(10);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
INSTANCE=new Mgr04();
}
return INSTANCE;
}
public void c() {System.out.println("c");}
public static void main(String[] args) {
for(int i=0;i<200;i++) {
new Thread(()->{
System.out.println(Mgr04.getInstance().hashCode());
}).start();
}
}
}

设计模式—singleton(单例模式)的更多相关文章

  1. [C++设计模式] singleton 单例模式

    这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例.这样做当然是有必定的.比方你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等. 你希望这个类在整个系统中仅仅能出现一个实 ...

  2. 一天一个设计模式——(Singleton)单例模式(线程安全性)

    一.模式说明 有时候,我们希望在应用程序中,仅生成某个类的一个实例,这时候需要用到单例模式. 二.模式类图 三.模式中的角色 Singleton角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的 ...

  3. C++设计模式-singleton单例模式_new

      class nocopyable { protected: nocopyable(){}; virtual ~nocopyable(){}; nocopyable(const nocopyable ...

  4. C++设计模式-Singleton单例模式

    template <typename T> class Singleton { public: template <typename... Args> static T* In ...

  5. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  6. 每天一个设计模式-4 单例模式(Singleton)

    每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...

  7. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  8. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  9. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

随机推荐

  1. 【Alpaca】.Net版开源配置中心 - 技术选型 Vue 3.0

    是否可以用 Vue 3.0 现有的Vue 2.* 不推荐,坐等Vue 3.0出迁移工具吧,手动改的话工作量还是不小的 新项目 考虑下团队内对Vue + TS + VS Code的熟练程度.过程中你会遇 ...

  2. TypeScript & as & Type Assertion

    TypeScript & as & Type Assertion Type Assertion (as) That is not vanilla JavaScript, it is T ...

  3. node.js & ORM & ODM

    node.js & ORM & ODM ODM & NoSQL Object Data Modeling 对象数据模型 Object Document Mapping 对象文档 ...

  4. 「NGK每日快讯」12.21日NGK第48期官方快讯!

  5. Nice!JavaScript基础语法知识都在这儿了

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 转载请注明出处! 链接:https://blog.csdn ...

  6. JPEG解码——(4)霍夫曼解码

    本篇是该系列的第四篇,主要介绍霍夫曼解码相关内容. 承接上篇,文件头解析完毕后,就进入了编码数据区域,即SOS的tag后的区域,也是图片数据量的大头所在. 1. 解码过程规则描述 a)从此颜色分量单元 ...

  7. call、apply和bind的实现

    call方法 基础版, 只能修改指向,不能传参 Function.prototype.myCall = function(context) { // 获取调用者,这里为bar context.fn = ...

  8. Spring—Document root element "beans", must match DOCTYPE root "null"分析及解决方法

    网上很多人说要把applicationContex.xml文件中加上如下第二行的<!DOCTYPE/>标签,说明DTD.<?xml version="1.0" e ...

  9. JS语法-ES6

    1.介绍 ECMAScript 6简称ES6,是JavaScript语言的下一代标准. 2.常用属性及方法 2.1常量与变量的定义 在JavaScript中,我们一般使用var来定义变量,实际上它是有 ...

  10. 第七届蓝桥杯JavaB组——第7题剪邮票

    题目: 剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示 ...