单例模式,是众多设计模式中,写法最多,套路最多,坑最多,面试被问最多的设计模式。
基本上,单例模式在面试中已经被问烂了,依稀记得我的上家公司面试我的时候,说到设计模式,直接就说,写一种设计模式,但单例除外。
但不得不说,单例由于其概念简单,实用性广的特点,在项目中很是常见。

概念:

单例模式就是确保一个类只有一个实例的设计模式。
设计的思路无非就是先new一个实例,以后都用这个实例就行了。
难点在于什么时机new出这个实例,以及如何确保有且只有这一个实例。

五种常见的单例实现

第一种:饿汉式(新手写法)

提前加载,所以也无法延迟加载,效率不高,不推荐

public class HungurySingleton { //缺点,无法延时加载,没有使用就已经加载了private static final HungurySingleton mInstance = new HungurySingleton();private HungurySingleton(){}public static HungurySingleton getHunguryInstance(){return mInstance;}
}

第二种:懒汉式(入门写法)

没有提前加载,但多线程下并发可能会出现多个实例

public class LazySingleton {private static LazySingleton mInstance;private LazySingleton(){}public static LazySingleton getmInstance(){if(mInstance == null){//就是这里,如果两个线程并发访问,里面的new语句就会执行两次mInstance = new LazySingleton();}return mInstance;}
}

第三种:双重检查锁(能写出这个,就有点东西了)

很明显,这样写,就不怕上面的那种并发问题了

public class DLCSingleton {private static volatile DLCSingleton mInstance =null; //volatile关键字是为了禁止编译器对 volatile关键字修饰的变量进行重排序,并保证volatile变量的读操作发生在写操作之后private DLCSingleton(){}public static DLCSingleton getmInstance(){if(mInstance == null){ //第一次检查synchronized (DLCSingleton.class){ //同步代码块if(mInstance == null){ //第二次检查mInstance = new DLCSingleton();}}}return mInstance;}
}

第四种:静态内部类实现(高手写法)

利用静态内部类是在被调用时才会被加载,算是延迟加载
static final 修饰instance,初始化后就不会被修改,保证线程安全

public class StaticInnerSingleton { //完成了懒汉式的延迟加载,同时static保证了线程安全。private  StaticInnerSingleton(){}public static StaticInnerSingleton getIntance(){return SingletonHolder.mIntance;}private static class SingletonHolder{ //私有的,初始化的时候,没有调用getIntance方法则不会加载//static,final是jvm提供的同步机制,初始化后就无法修改了private static final StaticInnerSingleton mIntance = new StaticInnerSingleton();  }
}

第五种:(牛人写法)

枚举做单例,think in java中的神思想,虽然我从来没见过谁在项目中实战用到
但看这个网上说的热火朝天,也是各种好处,比如写法简单,线程安全

public enum EnumSingleton {SPRING,SUMMER,AUTUMN,WINTER;
}

总结:

我只是列出常用的,当然,还有其他版本
比如静态代码块的写法,
还有双重检查锁前一个版本,就是没有第一步判空的写法,
还有用synchronized修饰方法的写法等等。

是我的话,一般情况下,
确保项目肯定没有并发的话,懒汉写法就没问题了。
一考虑到并发,就用双重检查锁的写法,是常用而且稳定的。
至于枚举写法,总之我还没有习惯这么写,可以尝试用用。

以上是个人意见,欢迎评论指正。

[设计模式] ------ 单例模式相关推荐

  1. Python设计模式-单例模式

    Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...

  2. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  3. 【学习笔记】ABAP OOD设计模式 - 单例模式

    ABAP OOD设计模式 - 单例模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 单例模式(Singleton Pattern)是常用的且较为简单的软件设计模式 ...

  4. Go 语言实现 23 种设计模式 单例模式

    Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...

  5. java singleton inner class_Java面向对象设计模式-单例模式

    Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...

  6. Java开发中常用的设计模式-单例模式

    单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...

  7. 炒冷饭系列:设计模式 单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...

  8. 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例

    场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...

  9. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  10. 小视频源码,设计模式单例模式

    小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...

最新文章

  1. Linux 命令集锦
  2. Android Fragment 你应该知道的一切
  3. python爬虫实例100-Python 练习实例1
  4. show profile 分析SQL
  5. UVa1600 PatrolRobot 巡逻机器人(bfs)
  6. 部署虚拟环境安装Linux系统(Linux就该这么学)笔记
  7. 数据分析学习笔记——Pandas库思维导图
  8. Python数据分析Numpy库方法简介(一)
  9. 智能优化算法:晶体结构算法-附代码
  10. 交换机基础知识点思维导图
  11. 微软官方地址下载sql 2000简体中文企业版(含SP3 SP4 下载地址)
  12. 搜狗输入法纯净_五款良心无广告的纯净输入法推荐
  13. android微信支付+指纹支付密码错误,为什么微信付款无法指纹支付密码?如何开启指纹支付?...
  14. Shader内置函数(方便自己看)
  15. mysql中查看密码有效期_Mysql5.7.9密码已过有效期的处理过程
  16. 请先切换至Wxml Pannel的解决方法
  17. Cacti的基本使用
  18. Mantis 安装与配置
  19. [埋坑系列] 基于QT/C++的杰瑞走迷宫小游戏 :1.大体构造
  20. linux 图像处理软件,最佳开源应用程序:图形/图像处理软件

热门文章

  1. 小程序基础能力~网络
  2. PHP正则匹配到2个字符串之间的内容,匹配HTML便签内容
  3. 转 从红帽、GitHub和Docker看开源商业模式的进阶
  4. Linux——Centos7网络配置1ens33文件
  5. 玩转python(2)多线程的历史2
  6. Java缓存框架使用EhCache结合Spring AOP
  7. 【Poj1017】Packets
  8. python_递归原理
  9. HDU 5600(瞎搞)
  10. windows下的_mkdir函数