李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
【转载】单例模式简介
Leefs
2020-02-20 PM
1936℃
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
NLP
4
标签云
Livy
MySQL
序列化和反序列化
Scala
Elastisearch
前端
散列
工具
容器深入研究
Beego
Netty
哈希表
二叉树
机器学习
国产数据库改造
Nacos
查找
数据结构
锁
人工智能
Sentinel
JVM
Java工具类
Eclipse
Java阻塞队列
ClickHouse
Java
Git
Redis
SQL练习题
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭