一.实现一个单例

可以使用如下的步骤实现一个单例类:

单例设计模式的实现流程

1、将构造方法私有化,使用private关键字修饰。使其不能在类的外部通过new关键字实例化该类对象。

2、在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。

3、对外提供一个静态方法getInstance()负责将对象返回出去,使用public static修饰

首先单例方法的构造方法是一个私有的方法,不可以通过构造器的方式进行构建,只能通过getInstance()方法获取单例。
下边的if()判断,判断是不是构造过,如果构造了就直接返回。这种需要在使用的时候,调用才会构建这种方式就是懒加载,需要了使用时构建,不会浪费资源。但是不是线程安全的。

加了以后线程是安全的了,但是锁的粒度太大 把syc加到方法里

如果第一个线程发现成员变量为null,准备创建对象;这是第二 个线程同时也发现成员变量为null,也会创建新对象。这就会造成在一个JVM中有多个单例类型的实例

再加入一个判空操作

由于可见性和指令重排,还需要加上volatile标识


多线程下的单例模式
单例模式

二,设计模式及其在Spring中的应用

单例模式定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
双重检查锁实现单例模式Code

 // double-check 双重检查锁class Singleton{private static volatile Singleton instance;private Singleton(){}public static sychronize Singleton getInstace(){if(instance==null){synchronized(Singleton.class){if(instance==null) instance=new Singleton(); }}return instance;}}

ApplicationContext实现原理

Spring依赖注入Bean实例默认是单例的。

Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。
分析getSingleton()方法

public Object getSingleton(String beanName){//参数true设置标识允许早期依赖return getSingleton(beanName,true);}protected Object getSingleton(String beanName, boolean allowEarlyReference) {//检查缓存中是否存在实例Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {//如果为空,则锁定全局变量并进行处理。synchronized (this.singletonObjects) {//如果此bean正在加载,则不处理singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {//当某些方法需要提前初始化的时候则会调用addSingleFactory 方法将对应的ObjectFactory初始化策略存储在singletonFactoriesObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {//调用预先设定的getObject方法singletonObject = singletonFactory.getObject();//记录在缓存中,earlysingletonObjects和singletonFactories互斥this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}return (singletonObject != NULL_OBJECT ? singletonObject : null);}

ps:spring依赖注入时,使用了双重检查锁实现的单例模式

单例设计模式在Spring中的应用相关推荐

  1. python单例设计模式(待补充)

    要点概论: 1. 理解单例设计模式 2. 单例模式中的懒汉式实例化 3. 模块级别的单例模式 4. Monostate单例模式 5. 单例和元类 6.单例模式Ⅰ 7. 单例模式Ⅱ 8. 单例模式的缺点 ...

  2. Java设计模式—单例设计模式(Singleton Pattern)完全解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

  3. 结合Spring源码学习单例设计模式

    之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...

  4. 分析JDK中的Runtime的单例设计模式以及使用小例子

    package july.star.thread23;import java.io.IOException;/*** RunTime * JDK中的一个单例设计模式* @author MoXingJi ...

  5. 笔记:Java中的单例设计模式

    之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...

  6. (单例设计模式中)懒汉式与饿汉式在多线程中的不同

    /*目的:分析一下单例设计模式中,懒汉式与饿汉式在多线程中的不同!开发时我们一般选择饿汉式,因为它简单明了,多线程中不会出现安全问题!而饿汉式需要我们自己处理程序中存在的安全隐患,但是饿汉式的程序技术 ...

  7. java中饿汉与懒汉的故事(单例设计模式)

    java中的单例设计模式 关于设计模式,这其实是单独存在的东西,它不属于java,但是在java中使用较多,所以今天我就给大家介绍下单例设计模式中的饿汉和懒汉这俩朴素的打工人. 首先我先说明下单例设计 ...

  8. Java中的单例设计模式

    什么是单例设计模式 所谓单例设计模式,就是采取一定的方法保证整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法. 目的:使用着在main方法中就不可以自己创建实例对象 ...

  9. 9种设计模式在Spring中的运用,一定要非常熟练!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:iCoding91 https://blog.csdn.ne ...

最新文章

  1. tf.signal.stft() 短时傅里叶变换的示例
  2. flyway常用配置_Spring Boot 2 实战:使用 Flyway 管理你数据库的版本变更
  3. 苦逼的.net程序员, 转行高富帅iOS移动开发
  4. NetAdvangate Infragisticss 控件在工程移动到别的机器上,引用失效问题
  5. python threading.Timer
  6. MongoDB学习(一)Centos6.5下安装mongoDB
  7. AHK生成随机但不重复的数字
  8. JAVA怎么创建被继承的类_Java入门之类的继承
  9. 解决win7英文版下中文显示乱码问题
  10. 如何在51单片机实现日程提醒(生日闹钟)
  11. 【网络安全学习实践】Windows基本DOS文件命令与简易病毒编写
  12. 自动白平衡技术(AWB)
  13. 使用R语言进行perMANVOA分析NMDS结果多个分组之间显著性
  14. 素描想要画出有质感的头发?方法找对了画技提升了~
  15. 基于yacto构建am5728 SDK
  16. 江西省省赛中职网络安全-Windows操作系统渗透测试
  17. 一张专家推荐的最健康的作息时间表,你能做到吗?
  18. JavaScript---网络编程(2)-函数与数组
  19. ssm基于微信小程序的游泳馆管理系统 uinapp 计算机毕业设计
  20. 有什么好用的语音转文字软件?介绍三个语音文件转文字的软件

热门文章

  1. 免费wifi不能上网
  2. angularJS常用指令
  3. 远程桌面登录Lubuntu
  4. Visio画组织结构
  5. NEON优化——OpenCV Resize双线性插值
  6. android手机文件储存地址,Android手机缓存的位置
  7. 广州2023 Qcon回顾
  8. Linux下轻松理解防火墙的工作原理及相关设置(三)firewalld服务、包括Direct Rules 和Rich Rules (地址伪装和转发)
  9. 安装linux 磁盘检测失败,Opensuse Linux开机磁盘检测失败
  10. java futuretask 状态_java并发编程之FutureTask