李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
【转载】单例模式简介
Leefs
2020-02-20 PM
1400℃
0条
# 【转载】单例模式简介 ### 一、概述 单例模式是设计模式中相对简单且非常常见的一种设计模式,但是同时也是非常经典的**高频**面试题,相信还是有很多人在面试时会挂在这里。本篇文章主要针对单例模式做一个回顾,记录单例模式的应用场景、常见写法、针对线程安全进行调试(看得见的线程)以及总结。相信大家看完这篇文章之后,对单例模式有一个非常深刻的认识。 文章中按照常见的单例模式的写法,由浅入深进行讲解记录;以及指出该写法的不足,从而进行演进改造。 秉承废话少说的原则,我们下面快速开始 ### 二、定义 **具体实现** > (1)将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。 > > (2)在该类内部产生一个唯一的实例对象,并且将其封装为private static类型。 > > (3)定义一个静态方法返回这个唯一对象。 **实现一:立即加载/“饿汉模式”** 立即加载使用就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象;先创建了再说。很着急的样子,故又被称为“饿汉模式”,)常见实现办法就是直接new实例化。 ```java public class Singleton{ //将自身实例化对象设置为一个属性,并用static、final修饰 private static final Singleton instance = new Singleton(); //构造方法私有化 private Singleton(){} //静态方法返回该实例 public static Singleton getInstance(){ return instance; } } ``` "饿汉模式"的优缺点: 优点:实现起来简单,没有多线程同步问题。 缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。 **实现二:延迟加载/"懒汉模式"** 延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为”懒汉模式“),常见的实现方法就是在get方法中进行new实例化。 ``` public class Singleton{ //将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; //构造方法私有化 private Singleton(){} //静态方法返回该实例 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } ``` "懒汉模式"的优缺点: 优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些条件下会节约了内存。 缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。 **实现三:线程安全”懒汉模式“** ```java public class Singleton{ //将自身实例化对象设置为一个属性 并用static修饰 private static Singleton instance; //构造方式私有化 private Singleton(){} //静态方法返回该实例,加synchronized关键字实现同步 public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } ``` 优点:在多线程情形下,保证了”懒汉模式“的线程安全。 缺点:在多线程情形下,synchronized方法通常效率低,显然这不是最佳的实现方案。 实现四:DCL双检查锁机制(DCL:double checked locking) ```java public class Singleton{ //将自身实例化对象设置为一个属性 并用static修饰 private static volatile Singleton instance; //构造方式私有化 private Singleton(){} //静态方法返回该实例 public static Singleton getInstance(){ //第一次检查instance是否被实例化出来,如果没有进入if块 if(instance == null){ synchronized(Singleton.class){ //某个线程取得了类锁。实例化对象前第二次检索instance是否已经被实例化出来,如果没有,才最终实例化对象 if(instance == null){ instance = new Singleton(); } } } return instance; } } ``` 方法四算是单例模式的最佳实现方式。内存占用率高,效率高,线程安全,多线程操作原子性。 *附:[原文链接](https://www.cnblogs.com/binaway/p/8889184.html)*
标签:
设计模式
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/633.html
上一篇
LeetCode-4 寻找两个有序数组的中位数
下一篇
单例模式volatile分析
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
数据结构
哈希表
线程池
GET和POST
Filter
Nacos
ClickHouse
FastDFS
FileBeat
Spark Core
SQL练习题
Java
Azkaban
Jquery
DataX
递归
Eclipse
机器学习
持有对象
LeetCode刷题
RSA加解密
JavaSE
队列
散列
SpringCloud
数学
Yarn
链表
栈
前端
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞