博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习与应用——单例模式
阅读量:6954 次
发布时间:2019-06-27

本文共 1673 字,大约阅读时间需要 5 分钟。

hot3.png

单例模式

作用:一个类只有一个实例,并且提供访问该实例的全局访问点

创建方式

1.懒汉方式

public class Singleton{	//使外部无法访问这个变量,而要使用公共方法来获取	private static Singleton single = null;	//只能单例类内部创建,所以使用私有构造器	private Singleton(){}	//公共方法返回类的实例,懒汉式,需要第一次使用生成实例	//用synchronized关键字确保只会生成单例	public static synchronized Singleton getInstance(){		if(single == null){			single = new Singleton();		}		return single;	}}

2.饿汉方式

public class Singleton{	//类装载时构建实例保存在类中	private static Singleton single = new Singleton();	private Singleton(){}	public static Singleton getInstance(){		return single;	}}

Spring中的单例

protected Object getSingleton(String beanName, boolean allowEarlyReference) {       Object singletonObject = this.singletonObjects.get(beanName);       if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {//1           synchronized (this.singletonObjects) {//2               singletonObject = this.earlySingletonObjects.get(beanName);               if (singletonObject == null && allowEarlyReference) {                   ObjectFactory
singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return (singletonObject != NULL_OBJECT ? singletonObject : null); }

spring依赖注入时使用的是“双重加锁”的单例模式

双重加锁:

1.如果单例已经存在,则返回这个实例

2.如果单例为null,进入同步块进行加锁,生成单例

应用场景

1.需要生成唯一序列的环境

 2.需要频繁实例化然后销毁的对象。
 3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
 4.方便资源相互通信的环境

转载于:https://my.oschina.net/u/2500431/blog/2249046

你可能感兴趣的文章
JavaScript正则表达式(2)
查看>>
开源 | Rainbond 3.5 pre-release
查看>>
css中px、em、rem区别与使用
查看>>
两个男同事打架 公司决定要不离职, 要不手牵手一下午, 结果他俩就选择.........
查看>>
(三)java版spring cloud+spring boot 社交电子商务平台 - Spring Cloud集成项目简介
查看>>
本地搭建ios测试包上传下载安装环境(类似蒲公英)
查看>>
BCH大区块导致中心化其实是伪命题
查看>>
Linux软件包管理之源码安装
查看>>
求两个数的最大公约数两种方法
查看>>
结对编程讲义-PPT
查看>>
SOLR
查看>>
配置Nutch模拟浏览器以绕过反爬虫限制
查看>>
小牛电动的软文列表,和实际用户的反馈实在是天上地下。。
查看>>
list()详解
查看>>
mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
查看>>
IBM WebSphere MQ win 安装过程
查看>>
获取目录下子目录及文件的大小
查看>>
DNS服务器基本服务(正向、反向解析)、别名、递归、迭代、增量传输、完全传输...
查看>>
varchar nvarchar char nchar varchar2 nvarchar2
查看>>
js 百度地图 添加自定义控件
查看>>