单例模式

定义:
   只有一个实例的类,并且提供唯一一种供外界访问的方式。

案例代码:

public class Singleton {private static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}public void print(){System.out.println("Hello");}
}
public class Test01 {public static void main(String[] args) {Singleton singleton = Singleton.getInstance();singleton.print();}
}

单例模式还可以再细分两种模式:

  • 懒汉式
  • 饿汉式

懒汉式(线程不安全)

也叫做单例的延迟加载方式,就是在第一次调用单例模式的类时才创建实例。

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

缺点:如果有两个线程同时第一次访问,则回创建两次实例,造成线程不安全的情况。

饿汉式(线程安全)

在程序加载单例模式类的时候就创建实例。也就是文章开头演示的案例。

public class Singleton {private static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}
}

缺点

  • 过早的就会被实例化,可能会造成资源浪费。
  • 如果初始化本身依赖于一些其他数据,那么也就很难保证其他数据会在它初始化之前准备好。

懒汉式(线程安全)

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

缺点:此种模式虽然是安全的,但由于把锁加到⽅法上后,所有的访问都因需要锁占⽤导致资源的浪费。如果不是特殊情况下,不建议此种⽅式实现单例模式。

懒汉式 - 使用类的内部类(线程安全)

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

优点:

  • 使⽤类的静态内部类实现的单例模式,既保证了线程安全有保证了懒加载,同时不会因为加锁的方式耗费性能。
  • 这主要是因为JVM虚拟机可以保证多线程并发访问的正确性,也就是⼀个类的构造⽅法在多线程环境下可以被正确的加载。
  • 此种⽅式也是⾮常推荐使⽤的⼀种单例模式

懒汉式-双重锁校验(线程安全)

是对上面 懒汉式(线程安全) 案例的优化

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

优点: 双重锁的方式是方法级锁的优化,减少了部分获取实例的耗时。

推荐博文:https://blog.csdn.net/qq_33329988/article/details/98259086
推荐书籍:《重学Java设计模式》— 小傅哥

【设计模式05】单例模式相关推荐

  1. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  2. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  3. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  4. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

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

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

  6. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  7. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  8. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  9. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

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

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

最新文章

  1. java 毫秒转时间字符串_java 时间字符串 转换 毫秒
  2. MySQL启动报:[ERROR] The server quit without updating
  3. 计算机网络技能专项训练一:基础配置
  4. c语言设计期末考试试题及答案,C语言程序的设计期末考试试题(含答案).pdf
  5. [导入]源代码版本控制(二)
  6. ML.NET Cookbook:(16)什么是规范化?为什么我需要关心?
  7. [CSS] Scale on Hover with Transition
  8. 中台产品经理能力模型
  9. SpringBoot2.0之七 实现页面和后台代码的热部署
  10. 【原】设置iOS项目BuildVersion自动增加
  11. 高等代数期末考试题库及答案_高等代数3学时试题题目及答案,课程2021最新期末考试题库,章节测验答案...
  12. android开发练习:天气应用
  13. 时间曲线统计图数据结构,时间工具
  14. Linux网卡流量监控工具
  15. Win11账号被锁定无法登录怎么办?Win11账号被锁定无法登录
  16. 要装修,找小米!联手宜家,小米要用AIoT攻占你的家居生活!
  17. 不平衡电桥中的星三角变换电流关系
  18. VB基础版版务处理_20050615
  19. 编程高手成长的六个阶段,你处于哪一阶段?
  20. poi清除书签_清理浏览器书签

热门文章

  1. 将数字0-9转为中文大写数字
  2. 微信小程序界面设计入门课程-样式wxss中使用css课程-字体-font-style字体风格
  3. iOS横屏电子签名上篇【核心原理: 旋转特定的屏幕 Quartz2D】应用场景:采集电子签名,支持签名界面为横屏其余页面都是竖屏、清除重写、灵活控制提示语信息、以及查看商户协议等
  4. 【数据可视化应用】绘制峰峦图(附R语言代码)
  5. VS工程文件常见后缀名文件含义
  6. MPLS 配置LDP本地会话实验 详解
  7. 已知函数fx=sin(wx+φ)_已知函数fx=Asin(wx+φ) (x∈R,A0,w0,0
  8. HelloWord代码
  9. 微信域名检测API接口实现方法及原理
  10. 播放器地址抓取 php,从优酷土豆视频地址中获取swf播放器分享地址 - PHP示例代码...