对今天学习的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的更多相关文章

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

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

  2. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  3. ooad单例模式-Singleton

                                                单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...

  4. iOS单例模式(Singleton)写法简析

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...

  5. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  6. 设计模式之——单例模式(Singleton)的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  7. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  8. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  9. IOS单例模式(Singleton)

    IOS单例模式(Singleton)   单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...

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

    static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...

随机推荐

  1. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  2. java中文乱码解决之道(六)-----javaWeb中的编码解码

    在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...

  3. 慎重管理SQL Server服务的登录(启动)账户和密码

    今天是大年初三,先跟大家拜个年,祝大家新年快乐.今天处理了一个alwaysOn问题——辅助副本因为磁盘空间不足一直显示[未同步——可疑],在日志中可以看到数据库处于挂起状态,与主副本失去同步.原以为只 ...

  4. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...

  5. static与并发

    在java中static用来修饰Class类中属性和方法. 被static修饰的成员属性和成员方法独立于该类的任何对象,它们在内存空间上会被放在描述Class的位置中,也就是说它们为此类(Class) ...

  6. 一次Mysql 死锁事故

    故障描述: 简单描述一下需求:我们写的一个计步器的客户端软件,用户通过手机客户端将用户的运动计步信息传到服务器. 服务器侧记录每个用户每次上传明细,同时每个用户有一个汇总值,参与全省排名. 1.加入明 ...

  7. WPF入门教程系列十五——WPF中的数据绑定(一)

    使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...

  8. easyuidatagrid中load,reload,loadData的区别

    摘要:datagrid中有load,reload,loadData那三个方式,皆是加载数据的,但又有差别.下面让我们一起来看看: 首先,load方法,比如我已经定义一个datagrid的id为grid ...

  9. 重置EntityFramework数据迁移到洁净状态

    前言 翻译一篇有关EF数据迁移的文章,以备日后所用,文章若有翻译不当的地方请指出,将就点看,废话少说,看话题.[注意]:文章非一字一句的翻译,就重要的问题进行解释并解决. 话题引入 无法确定这种场景是 ...

  10. iOS开发之表视图爱上CoreData

    在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...