【前言】

设计模式是无数前辈们经过多年的实践与思考,提炼出的解决某些问题的套路;自己在工作中不断的应用与思考对设计模式的精妙体会越来越深刻;今天为大家分享一下十分经典的单例模式。

【实现单例】

                1、饿汉式

(1)实现原理:直接加载;

(2)优缺点:

①优点:实现简单,不存在并发问题

①缺点:不管用不用都在内存中,占用资源

(3)代码实现:

public class Singleton {//静态成员变量private static Singleton singleton = new Singleton();private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}//构造函数私有化private Singleton(){}//返回静态资源中Singleton实例public static Singleton getInstance() {return singleton;}/*** 测试*/public static void main(String[] args) {//通过调用类的静态方法返回类的实例对象Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();s1.setName("haha");s2.setName("zhanghan");System.out.println(s1.getName());System.out.println(s2.getName());}
}

                    2、懒汉式

(1)实现原理:直接加载;

(2)优缺点:

①优点:实现简单,不存在并发问题

①缺点:不管用不用都在内存中,占用资源

(3)代码实现:

public class Singleton {//不初始化实例对象private static Singleton singleton = null;private String name;public String getName() {return name;}//构造函数私有化private Singleton(){}public void setName(String name) {this.name = name;}//当被调用时才动态实例化public static Singleton getInstance() {if(singleton == null) {singleton = new Singleton();}return singleton;}
}

(4)初步优化:

①存在问题:懒汉式解决了饿汉式的实例对象初始化占用内存的情况,但是懒汉式存在线程安全的问题,当多个线程同时访问getInstance()方法时,有可能在第一个线程进入if语句是还没new Singleton()时,这时第二个线程判断if的时候就会为真,则会创建新的实例,单例模式设计失败;

②解决方案:在getInstance()方法上添加synchronized修饰符,表示线程同步,即当一个线程访问该方法时,其他线程需要等待其释放资源。

③初步优化代码:

public static synchronized Singleton getInstance() {if(singleton == null) {    singleton = new Singleton();}return singleton;}

(5)深入优化:

①初步优化存在问题:初步优化解决了懒汉式的线程不安全的问题,但是这样会降低系统的性能,当一个线程占用了该资源,其他的线程只能等待,系统的性能大大下降。

②解决方案:双重锁定校验;

③深入优化代码:

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

【总结】

对设计模式的应用,一方面可以大大提高代码的可扩展性,另一方面更易于维护;在接下来文章中会为大家分享更多的设计模式,大家有什么建议可以在评论中写出大家一起交流。

设计模式(三):单例模式相关推荐

  1. 设计模式三、单例模式

    设计模式part3 单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 常见的单例模式可以分为懒汉模式和饿汉模式 懒 ...

  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. 一篇博客读懂设计模式之---单例模式

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

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

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

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

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

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

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

  10. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...

最新文章

  1. 2021年春季学期-信号与系统-第三次作业参考答案-第六道题
  2. 帮助创建未来的 .NET 客户端开发
  3. 关于欧拉工程的一道递推题
  4. 【连载】第一章:亚洲-台湾(1)
  5. 做方差分析需要正态性检验吗_检验工序要做PFMEA吗?检验如何做PFMEA?
  6. 别人7天乐,运维还苦逼值班?
  7. html背景只向x轴扩散,有趣的css—简单的下雨效果2.0版
  8. python查看数据_使用Python获取GA数据
  9. docker使用已拉取的纯净python3.8镜像(应该为debian版本)制作detectron2 docker 镜像
  10. 【支付宝商家中心】支付功能签约,产品签约失败;修改经营类目;系统检测到您的账户不符合国家相关法律法规或《支付宝用户服务协议》约定
  11. Binarized Neural Network : BNN二值神经网络代码实例
  12. 长时间戴耳机对耳朵的伤害多大?这几点一定要牢记
  13. android 强制退出程序,Android 强制且彻底的退出app
  14. Win10无线网络图标不见了,看这一条就行。
  15. linux下反向解析文件的权限应该是什么,Linux 下的DNS服务器中,反向解析文件的内容包括( )...
  16. 单反相机风景摄影易记易学口诀
  17. C语言串口通信AD转换定时器中断,大神们能帮我看一下程序吗?为啥串口中断没法打断定时器中断。...
  18. 如何将Python脚本转换为exe,双击exe自动执行Python脚本功能
  19. Delphi的高光时刻!C#之父Anders Hejlsberg的祝福:持续更新、持续发展的Delphi家族- Delphi 2009及其后的新功能
  20. 网络爬虫requests和bs4简单入门

热门文章

  1. 拒绝空谈 AI 设想!手把手教你构建实时、高可用的 AI 调度平台
  2. 如何基于谷歌的最强 NLP 模型进行影评分析?
  3. 公开薪资后,我会被解雇吗?
  4. @程序员,全面进入万物互联时代必不可缺的 12 大开发平台
  5. 谷歌 AI 中国中心彻底变天了!
  6. AI 开发者如何摆脱只有“人工”没有“智能?
  7. 大前端时代下,如何成为一名优秀的程序员?
  8. 美团百度联合布局无人驾驶外卖;高通裁员千人;英特尔关闭可穿戴业务 | CSDN极客头条...
  9. 走心地讨论一下,一个中国码农在硅谷求职的实用经历
  10. rancher单节点离线安装_Rancher花里胡哨的部署方式