单例模式 - Singleton
对今天学习的Singleton Pattern简单总结下:
定义:保证一个类只有一个实例,必须自己创建自己的实例,并提供一个访问它的全局访问点。
- private 构造函数;
- private static 成员变量:缓存实例;
- public static 方法:创建类实例;
作用
- 保证唯一实例,减少内存开支,避免对资源的多重占用;
- 提供对唯一实例的受控访问;
- 全局变量必须在程序一开始就创建好,单例模式可以延迟初始化;
适用场合
- 控制资源的使用,通过线程同步来控制资源的并发访问;
- 控制实例产生的数量,达到节约资源的目的;
- 作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信;
普通单例模式
通常情况下,单例模式分为饿汉式和懒汉式,具体代码参见下方
- 饿汉式:预先创建实例、占用内存,但线程安全
- 懒汉式:使用时再创建实例、相对节省内存,但存在线程安全问题
多线程下的单例模式
进程加锁 (懒汉式 -> 饿汉式) –> 双重锁定(Double-Check Locking) –> 静态内部类 –> 枚举
懒汉式
public class Singleton{ // 单例-懒汉式
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstace()
{
if(null==instance)
instance = new Singleton();
return instance;
}
}
注:同步方法解决多线程问题。仅第一次设置instance需要同步,之后每次调用此方法,同步都是累赘降低性能。
双重锁定 - 懒汉式改进版
public class Singleton{ // 单例-双重锁定(懒汉式改进版)
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstace()
{
if(null==instance){
synchronized(Singleton.class){
if(null==instance)
instance = new Singleton();
}
}
return instance;
}
}
注:确保实例仅在未创建时加锁,亦能保证多线程安全。
volatile:避免内存模型允许的’无序写入’(某个线程可能会获得一个未完全初始化的实例[构造完整但是部分初始化])导致失败。
饿汉式
public class Singleton{ // 单例-饿汉式
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstace()
{
return instance;
}
}
注:使用静态初始化(无需显示编写线程安全代码),加载时即实例化,提前占用系统资源。
静态内部类
public class Singleton{ // 静态内部类
private Singleton() {}
private static class SingletonHelper{
private final static Singleton instance = new Singleton();
}
public static Singleton getInstace(){
return SingletonHelper.instance;
}
}
注:加载时不会初始化静态变量instance,达到延时加载。
static:成员变量只保存一份副本;
final:保证变量不可变。
枚举
public class Singleton{ // 枚举
private Singleton() {} }
注:单元素的枚举类型是实现Singleton的最佳方式。
参考:
单例模式 - Singleton的更多相关文章
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- ooad单例模式-Singleton
单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...
- iOS单例模式(Singleton)写法简析
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- 浅谈设计模式--单例模式(Singleton Pattern)
题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...
- 设计模式之——单例模式(Singleton)的常见应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- 设计模式之单例模式(Singleton Pattern)
单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...
- 设计模式(4) -- 单例模式(Singleton)
设计模式(4) -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...
- IOS单例模式(Singleton)
IOS单例模式(Singleton) 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...
- java设计模式之 单例模式 Singleton
static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...
随机推荐
- js问题杂记
1.如何把字符串数组 转成数组对象? eval妙用 var str = "[\"UserName=1,Pwd=1\",\"UserNmae=1,Pwd=1,Sa ...
- 企业IT管理员IE11升级指南【6】—— Internet Explorer 11面向IT专业人员的常见问题
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- meta标签中的http-equiv属性使用介绍(转载)
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- WaitType:ASYNC_NETWORK_IO
官方文档的定义,是指SQL Server 产生的结果集需要经过Network传递到Client,Network不能很快将结果集传输到Client,导致结果集仍然驻留在SQL Server的Sessio ...
- TSQL Merge On子句和When not matched 语义理解
Merge 的On子句指定Match condition,When子句指定过滤条件,如果Source Table和Targe Table匹配的上,很好理解:如果匹配不上,必须深入理解不匹配的条件,否则 ...
- OpenCASCADE Gauss Integration
OpenCASCADE Gauss Integration eryar@163.com Abstract. Numerical integration is the approximate compu ...
- 小白学习MVC5+EF6遇到的问题一
这两天有空的时候会看看Miro大神的MVC5+EF6系列文章,推荐大家看看. 以前没有接触过,纯小白一个,今天在学习的过程中遇到了一个问题,习惯了WebForm,在运行页面之前都会右键设置为起始页,我 ...
- 《ASP.NET MVC 5框架揭秘》样章发布
今天算是新作<ASP.NET MVC 5框架揭秘>正式上架销售的日子(目前本书在互动网已经到货),为了让更多适合的朋友们能够阅读此书,同时也避免让不适合的读者误买此书,特将此书的样章发布出 ...
- HTML中哪些标签的值会被提交到服务器呢?
<form> <input name="">标签 <select name="">标签 <textarea name= ...
- Ubuntu杂记——双系统重装Win7后找不到Ubuntu的解决办法
之前装过Ubuntu和Win7的双系统,后来重装了Win7,发现Ubuntu不见了,那会没怎么用,也没去解决问题.现在再看Android内核剖析,大部分都是在Ubuntu环境下进行的,所以百度了一些方 ...