单例模式

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

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

应用实例

  • 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. 记一次小米手机安装Google Play(其他手机类似)

    记一次小米手机安装Google Play(其他手机类似) 最近换了一款小米10青春版,性价比很高,对于开发者而言,手机自带商店的软件内容往往不能满足需求,而需要单独定制习惯性的APP,博主通过最近的尝 ...

  2. VSCode 在 Vue 导入路径中使用 @ 符号后无法正确跳转 bug

    VSCode 在 Vue 导入路径中使用 @ 符号后无法正确跳转 bug bug jsconfig.json { // This file is required for VSCode to unde ...

  3. vue-cli & webpack & vue.config.js

    vue-cli & webpack & vue.config.js configureWebpack // vue.config.js module.exports = { confi ...

  4. involution 内卷化

    involution 内卷化 虽然不熟悉 involution,但是我想起另外两个常用词:evolution(进化)和 revolution(革命). 它们共同的词根volute,拉丁语原意是&quo ...

  5. js Memory Management

    js Memory Management 垃圾回收是一个术语,在计算机编程中用于描述查找和删除那些不再被其他对象引用的对象的处理过程. 换句话说,垃圾回收是删除任何其他对象未使用的对象的过程. 垃圾收 ...

  6. code to markdown auto converter

    code to markdown auto converter code => markdown how to import a js file to a markdown file? // a ...

  7. mysql数据库表引入redis解决方案

    缓存方案 缓存方案在我的另外一篇博客里有详细说明,地址:https://www.cnblogs.com/wingfirefly/p/14419728.html 数据结构: 方案1: 1.存储结构采用h ...

  8. django学习-18.*args和**kwargs的用法和使用场景

    目录结构 1.前言 2.[*args]的用法 2.1.第一步:首先编写这样的函数[test1]. 2.2.第二步:给函数[test1]赋值相关入参值. 2.3.第三步:调用函数[test1],得到以下 ...

  9. Java线程池实现原理及其在美团业务中的实践

    本文转载自Java线程池实现原理及其在美团业务中的实践 导语 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供 ...

  10. UDP编程详解

    目录 报文格式 通信过程 UDP客户端流程 UDP客户端编码 UDP服务器流程 UDP服务器编码 参考文献 UDP与TCP的不同之处是:他的通信不需要建立连接的过程.中文名称用户数据报协议.时OSI参 ...