单例模式的7种写法及其应用场景你都熟悉了吗,快来看看吧
单例模式的7种写法
- 定义
- 单例模式的写法有以下7种
- 1. 饿汉式(静态常量)
- 2. 懒汉式(线程不安全)
- 3. 懒汉式(线程安全,同步方法)
- 4. 懒汉式(线程安全,同步代码块)
- 5. 双重检查
- 6. 静态内部类
- 7. 枚举
- 单例应用场景
- 单例模式注意事项和细节说明
设计模式(Design pattern),提供了在软件开发过程中面临的一些问题的解决方案,主要分创建型模式、结构型模式和行为型模式。其中的单例模式,属于创建型模式。
而单例模式是在学习中最常见的一种,而就这一种模式在实现上就有好多种写法,而且每种写法之间都有一些联系和它们的使用场景。那废话不多说,快上车,我们一起看看吧。
定义
单例模式:单例模式就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其实例的方法。
单例模式的写法有以下7种
1. 饿汉式(静态常量)
步骤:
- 构造器私有化(防止new)
- 类的内部类创建对象
- 向外暴露一个静态的公共方法
- 代码实现
代码实现
// 饿汉式
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
结果显示它们是同一个对象。
优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
单例应用场景
Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~
windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
网站的计数器,一般也是采用单例模式实现,否则难以同步。
应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
单例模式注意事项和细节说明
单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能
当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)
在学习过程中,既是总结,也是希望能帮到大家,如有纰漏,请留言。
单例模式的7种写法及其应用场景你都熟悉了吗,快来看看吧相关推荐
- 使用严格模式的坏处_再见面试官:单例模式有几种写法?
点击上方"JAVA",星标公众号重磅干货,第一时间送达 饱汉模式 饿汉模式 Holder模式 枚举模式 丑陋但好用的语法糖 总结 " "你知道茴香豆的'茴'字有 ...
- 单例模式的八种写法比较
转:https://www.cnblogs.com/zhaoyan001/p/6365064.html 单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生.一般介绍单例模式的书籍 ...
- 【设计模式】各个击破单例模式的8种写法
单例模式 在一个系统开发过程中,我们在基于节省内存资源.保证数据内容的一致性的考虑上,往往需要对某些类要求只能创建一个实例,即「保证类只有一个实例」的设计模式就是单例模式. 比如我们遇到过的各种Man ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...
- Java 实现单例模式的七种写法
单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如, ...
- java 静态内部类 线程安全问题_单例模式的七种写法, 面试题:线程安全的单例模式...
http://cantellow.iteye.com/blog/838473 http://meizhi.iteye.com/blog/537563 第一种(懒汉,线程不安全): Java代码 pu ...
- Java设计模式——单例模式的七种写法
单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式.在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...
- 单例模式的七种写法(转)
转载请注明出处:http://cantellow.iteye.com/blog/838473 第一种(懒汉,线程不安全): Java代码 public class Singleton { priv ...
- java单例模式的七种写法_Java设计模式之单例模式的七种写法
什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...
最新文章
- (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】...
- python基础语法第10关作业-Python基础语法习题一
- 您试图打开以前版本的Microsoft Office创建的文件。注册表策略设置已阻止此文件在该版本中打开的解决办法
- web相关基础知识1
- Extjs可视化设计视频教程二
- python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根
- HoloLens还太远 必应才是微软目前的重头戏
- 菜鸟学Linux 第055篇笔记 php基础
- linux怎么重载mysql配置命令_【Linux命令】数据库mysql配置命令
- 超详细window10系统快速搭建Linux镜像环境
- finereport与OA系统集成的完全方案
- fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
- 二进制计算机在线使用,二进制计算器
- 基于WiFi的室内定位
- 数学黑洞6174问题
- STM32-HAL-SPI-读写W25Q128FV-JEDEC ID(1)
- 千兆万兆以太网测试仪
- 解决DNS服务器未响应网络异常
- hdmi网线延长器_60米HDMI网线信号延长器延长接头(MT-ED03)
- 牛顿(Newton)迭代法求解非线性方程以及方程组的Matlab实现