单例模式即一个JVM内存中只存在一个类的对象实例,并提供一个访问它的全局访问点。

分类

1、懒汉式
类加载的时候就创建实例
2、饿汉式
使用的时候才创建实例
3、当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类

懒汉式

  1. 线程不安全,不可用
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }
}
  1. 线程安全,同步方法,效率低,不推荐
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }
}
  1. 线程不安全,会产生多个实例,不可用
public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {singleton = new Singleton();}}return singleton;}
}

饿汉式

无线程安全问题,不能延迟加载,影响系统性能
4.

public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; }
}
public class Singleton { private static Singleton instance = null; static { instance = new Singleton(); } private Singleton (){} public static Singleton getInstance() { return instance; }
}
  1. 双重校验锁,线程安全,推荐使用
public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}
}
  1. 静态内部类,线程安全,主动调用时才实例化,延迟加载效率高,推荐使用
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; }
}
  1. 枚举类型,无线程安全问题,避免反序列华创建新的实例,很少使用
public enum Singleton { INSTANCE; public void whateverMethod() { }
}

注意事项

1、考虑多线程问题
2、单例类构造方法要设置为private类型禁止外界new创建
private Singleton() {}
3、如果类可序列化,考虑反序列化生成多个实例问题,解决方案如下

private Object readResolve() throws ObjectStreamException { // instead of the object we're on, return the class variable INSTANCE return INSTANCE;
}

使用场景

1、工具类对象
2、系统中只能存在一个实例的类
3、创建频繁或又耗时耗资源且又经常用到的对象

下面是单例模式在JDK的应用

另外,spring容器中的实例默认是单例饿汉式类型的,即容器启动时就实例化bean到容器中,当然也可以设置懒汉式defalut-lazy-init="true"为延迟实例化,用到时再实例化。

彩蛋

欢迎加入请求群学习交流:
Java/Python架构师①群:415777345
电脑PC用户快捷加入(点击超链接):415777345
手机QQ扫码加入:

SpringBoot SpringCloud Docker K8s ①群:317945902
电脑PC用户快捷加入(点击超链接):317945902
手机QQ扫码加入:

欢迎进群交流探讨!

单例模式(Singleton)分析相关推荐

  1. 设计模式(21):创建型-单例模式(Singleton)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  2. python3中的单例模式Singleton

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-21 09:09:09 # @Author : cdl (1217096 ...

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

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

  4. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  5. python单例_Python - 单例模式(Singleton)

    单例模式(Singleton) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23374575 单例模式 , 类的实例从始至终, ...

  6. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  7. 设计模式之——单例模式(Singleton)的常见应用场景(转):

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  8. java设计模式 单例_java设计模式一(单例模式singleton)

    1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...

  9. Net设计模式实例之单例模式( Singleton Pattern)

    一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...

  10. muduo源码分析2——Singleton分析

    1. 一般singleton写法 单例模式即要求只有在第一次调用的时候创建该对象,主要分为以下两条路(返回指针还是引用),返回引用可以防止使用中delete instance导致对象被提前销毁: pr ...

最新文章

  1. SharePoint 2010中的客户端AJAX应用——ASP.NET AJAX模板
  2. VUE的本地应用-V- bind
  3. redchat怎么编写shell脚本_shell脚本编写思路
  4. Flash将在2年内死亡 市场份额已经降至6%
  5. 又是金三银四,都是Java程序员,你为什么面试总拿不到高薪?
  6. Sting中方法举例
  7. 轉:VB6中将数据导出到Excel提速之法
  8. 代码流程图_助力理解js代码,进阶JavaScript代码能力——js2flowchart
  9. 2021-09-14Apriori 算法是基于关联规则的高效数 据挖掘算法
  10. canvas webGL SVG 比较
  11. PageHelper 分页,total总数等于每页数量的问题解决
  12. Cannot construct instance of `com.baomidou.mybatisplus.core.metadata.IPage`
  13. lol各个区服务器位置2020,lol大区排名2020
  14. linux查看所有文件
  15. 恒生电子股份有限公司--软件测试--《社招、校招jd、校招行程,招聘动态》整理
  16. 被讨厌的勇气:人际关系论
  17. Day04 - Array Cardio 指南一
  18. RFID电子配线架系统
  19. 成都奔驰加装三色氛围灯 蔚一车改
  20. axios请求配置baseURL选项

热门文章

  1. poj 2454 随机化(划片使得选举胜利)
  2. 测试工程师入门知识点整理
  3. ubuntu16.04,exFAT格式U盘无法打开,离线解决方式
  4. 网站的robots 文件写法 附自动生成工具网址
  5. Linux实战教学笔记53:开源虚拟化KVM(一)搭建部署与概述
  6. 常用的计算机优化软件有哪些,计算机常用的硬件和软件优化软件和优化方法有哪些,如何提高WindowsXP系统的运行速度和稳定性...
  7. linux md5加密文件,linux md5 加密字符串和文件方法
  8. 报错org.apache.ibatis.builder.BuilderException: Error creating SqlSource for SqlProvider. Method ‘inse
  9. MySQL讲义第 43 讲——select 查询之查询练习(一)
  10. android 键盘挡住popupwindow,软键盘遮挡住popupWindow问题