单例模式的7种写法

  • 定义
    • 单例模式的写法有以下7种
      • 1. 饿汉式(静态常量)
      • 2. 懒汉式(线程不安全)
      • 3. 懒汉式(线程安全,同步方法)
      • 4. 懒汉式(线程安全,同步代码块)
      • 5. 双重检查
      • 6. 静态内部类
      • 7. 枚举
      • 单例应用场景
      • 单例模式注意事项和细节说明

  设计模式(Design pattern),提供了在软件开发过程中面临的一些问题的解决方案,主要分创建型模式、结构型模式和行为型模式。其中的单例模式,属于创建型模式。

  而单例模式是在学习中最常见的一种,而就这一种模式在实现上就有好多种写法,而且每种写法之间都有一些联系和它们的使用场景。那废话不多说,快上车,我们一起看看吧。

定义

  单例模式:单例模式就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其实例的方法。

单例模式的写法有以下7种

1. 饿汉式(静态常量)

步骤

  1. 构造器私有化(防止new)
  2. 类的内部类创建对象
  3. 向外暴露一个静态的公共方法
  4. 代码实现

代码实现

// 饿汉式
class Singleton {//构造器私有化private Singleton() {}//本类内部创建对象实例private final static  Singleton instance = new Singleton();//提供一个公有的静态方法,返回实例对象public static Singleton getInstance() {return instance;}
}

优缺点:

  优点:这种写法比较简单,就是在类装载的时候就完成了实例化。避免了线程同步问题。

  • 线程安全
  • 在类加载的同时已经创建好一个静态对象,调用时反应速度快

  缺点:来类装载的时候就完成了实例化,没有达到Lazy Loading的效果。如果从始至终未使用过这个实例,则会造成实例的浪费。

2. 懒汉式(线程不安全)

代码

//懒汉式(线程不安全)
class Singleton {private Singleton() {}private static Singleton instance;public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

缺点:

  • 起到了Lazy Loading的效果,但是只能在单线程下使用。
  • 多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及 往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。

3. 懒汉式(线程安全,同步方法)

//懒汉式(线程安全, 同步方法)
class Singleton {private Singleton() {}private static Singleton instance;public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

优点:解决了线程不安全问题。

缺点:效率太低。

4. 懒汉式(线程安全,同步代码块)

class Singleton {private Singleton() {}private static Singleton instance;public static synchronized Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {instance = new Singleton();}}return instance;}
}

优点:解决方法3效率低的问题。

5. 双重检查

//懒汉式(双重检查)
class Singleton {private Singleton() {}private static volatile Singleton instance;//提供一个公共方法,加入双重检查,解决线程问题,同时解决懒加载问题//同时保证了效率public static synchronized Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if(instance == null) {instance = new Singleton();}}}return instance;}
}

优点:线程安全;延迟加载;效率较高

6. 静态内部类

//懒汉式(静态内部类)
class Singleton {private Singleton() {}//写一个静态内部类,该类中有一个静态属性Singletonprivate static class SingletonInstance {private static final Singleton INSTANCE = new Singleton();}public static synchronized Singleton getInstance() {return SingletonInstance.INSTANCE;}
}

优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高。

7. 枚举

public class singleton1 {public static void main(String[] args) {Singleton singleton = Singleton.INSTANCE;Singleton singleton1 = Singleton.INSTANCE;System.out.println("singleton.hashCode() :" + singleton.hashCode());System.out.println("singleton1.hashCode() :" + singleton1.hashCode());System.out.println(singleton == singleton1);singleton.sayOk();}
}//使用枚举可以实现单例
enum Singleton {INSTANCE;public void sayOk() {System.out.println("OK");}
}

结果输出

singleton.hashCode() :1360875712
singleton1.hashCode() :1360875712
true
OK

结果显示它们是同一个对象。

优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。

单例应用场景

  1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~

  2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。

  3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

  4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

  5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

单例模式注意事项和细节说明

  1. 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能

  2. 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new

  3. 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)

在学习过程中,既是总结,也是希望能帮到大家,如有纰漏,请留言。

单例模式的7种写法及其应用场景你都熟悉了吗,快来看看吧相关推荐

  1. 使用严格模式的坏处_再见面试官:单例模式有几种写法?

    点击上方"JAVA",星标公众号重磅干货,第一时间送达 饱汉模式 饿汉模式 Holder模式 枚举模式 丑陋但好用的语法糖 总结 " "你知道茴香豆的'茴'字有 ...

  2. 单例模式的八种写法比较

    转:https://www.cnblogs.com/zhaoyan001/p/6365064.html 单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生.一般介绍单例模式的书籍 ...

  3. 【设计模式】各个击破单例模式的8种写法

    单例模式 在一个系统开发过程中,我们在基于节省内存资源.保证数据内容的一致性的考虑上,往往需要对某些类要求只能创建一个实例,即「保证类只有一个实例」的设计模式就是单例模式. 比如我们遇到过的各种Man ...

  4. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...

  5. Java 实现单例模式的七种写法

    单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如, ...

  6. java 静态内部类 线程安全问题_单例模式的七种写法, 面试题:线程安全的单例模式...

    http://cantellow.iteye.com/blog/838473 http://meizhi.iteye.com/blog/537563 第一种(懒汉,线程不安全): Java代码  pu ...

  7. Java设计模式——单例模式的七种写法

    单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式.在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  8. 单例模式的七种写法(转)

    转载请注明出处:http://cantellow.iteye.com/blog/838473 第一种(懒汉,线程不安全): Java代码   public class Singleton { priv ...

  9. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

最新文章

  1. (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】...
  2. python基础语法第10关作业-Python基础语法习题一
  3. 您试图打开以前版本的Microsoft Office创建的文件。注册表策略设置已阻止此文件在该版本中打开的解决办法
  4. web相关基础知识1
  5. Extjs可视化设计视频教程二
  6. python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根
  7. HoloLens还太远 必应才是微软目前的重头戏
  8. 菜鸟学Linux 第055篇笔记 php基础
  9. linux怎么重载mysql配置命令_【Linux命令】数据库mysql配置命令
  10. 超详细window10系统快速搭建Linux镜像环境
  11. finereport与OA系统集成的完全方案
  12. fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
  13. 二进制计算机在线使用,二进制计算器
  14. 基于WiFi的室内定位
  15. 数学黑洞6174问题
  16. STM32-HAL-SPI-读写W25Q128FV-JEDEC ID(1)
  17. 千兆万兆以太网测试仪
  18. 解决DNS服务器未响应网络异常
  19. hdmi网线延长器_60米HDMI网线信号延长器延长接头(MT-ED03)
  20. 牛顿(Newton)迭代法求解非线性方程以及方程组的Matlab实现

热门文章

  1. Android 获取IP与mac地址
  2. 公共WiFi有风险,使用请注意。
  3. 图像分割(1):标签制作——labelme使用
  4. 国内看安卓源码网站推荐
  5. 直播 | 美图云接入层的架构演进
  6. QDialog 简介
  7. 新世界!打开Selenium和PhantomJs的大门!--爬虫福音
  8. echarts柱状图横向 名字过长时显示省略号
  9. 【随手记】浏览器的高级API
  10. mixins php,Mixins的使用