单例模式(Singleton Pattern)

定义:确保某个类只有一个实例,并且自行实例化并向整个体系提供这个实例

需求:保证对象只创建一次

场景:线程池、缓存、日志对象、对话框等常被设计为单例。

Singleton 通过构造方法限定 private 避免类在外部被实例化,在同一个虚拟机范围内,Singleton 的实例只能通过 getInstance 访问。

事实上,通过 Java 的反射机制能够实例化构造函数为 private 的类,基本是上所有的单例都失效。

优点:减少了内存的消耗,重用。

单例通用代码01:(饿汉式)

public class Singleton {

    private static final Singleton singleton = new Singleton();

    private Singleton(){
} public static Singleton getInstance(){
return singleton;
}
   public void say(){}
}

可能产生多个实例02:(懒汉式)

public class Singleton{
private static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){if(instance == null){
instance = new Singleton();
  }
}
return instance;
}
}

在高并发的情况下,可能在 instance ==null 与 new Singleton 之间产生多例。

解决多例的问题:03(懒汉式)方法上加锁

public class Singleton {
private static Singleton instance = null; private Singleton(){} public static synchronized Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
} public void say(){
//todo something
}
}

使用双检查锁:04(懒汉式)双检查,方法内加锁

public class Singleton {
private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class) {
if(instance==null) {
instance = new Singleton();
}
}
}
return instance;
} public void say(){
//todo something
}
}

饿汉式的单例模式,不会出现线程安全的问题。

懒汉式本身是非线程安全的。

方法上加锁与方法内双检查加锁:方法上加锁,虽然线程安全,但是每次都要同步,会影响性能 99% 的情况下是不需要同步的。

方法内检查2次加锁,确保第一次调用的时候加锁,这样是线程安全的,避免了性能的损耗。

扩展:固定数量的单例

public class ExtSingleton {

    //最大单例个数
private static int maxNumOfSingleton = 2; //单例名称
private static ArrayList<String> nameList = new ArrayList<>(); //单例集合
private static ArrayList<ExtSingleton> singletons = new ArrayList<>(); private ExtSingleton(){} private ExtSingleton(String name){
nameList.add(name);
} static {
for(int i=0;i<maxNumOfSingleton;i++){
singletons.add(new ExtSingleton("singleton:"+i));
}
} public static ExtSingleton getInstance(){
//todo 获取单例某个对象
return singletons.get(0);
} }

五、Singleton 单例模式的更多相关文章

  1. Java中的五种单例模式实现方法

    [代码] Java中的五种单例模式实现方法   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...

  2. singleton单例模式

    单例设计模式 单例设计模式概述    单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供    优点:    在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...

  3. Singleton 单例模式 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 设计模式01: Singleton 单例模式(创建型模式)

    Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...

  5. Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。

                                                                                                        ...

  6. 五种方法实现Java的Singleton单例模式

    面试的时候经常会问到Java的单例模式,这道题能很好的考察候选人对知识点的理解程度.单例模式要求在系统运行时,只存在唯一的一个实例对象. 下面我们来详细剖析一下其中的关键知识点,并介绍五种实现方法,以 ...

  7. 开发设计模式(五)单例模式(Singleton Pattern)

    http://blog.sina.com.cn/s/blog_89d90b7c0101805m.html 单例模式:意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提 ...

  8. Java中的五种单例模式

    Java模式之单例模式: 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例. 特点: 1,一个类只能有一个实例 2 自己创建这个实例 3 整个系统都要使用这个实例 例: 在下面 ...

  9. 一天一个设计模式——(Singleton)单例模式(线程安全性)

    一.模式说明 有时候,我们希望在应用程序中,仅生成某个类的一个实例,这时候需要用到单例模式. 二.模式类图 三.模式中的角色 Singleton角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的 ...

随机推荐

  1. Maven概念模型

    两个核心 1.依懒管理:对jar包管理 2.项目构建管理:通过命令进行项目构建管理

  2. if、else、elif

    if后面+判断条件 elif后面+判断条件 else 否则进行某些操作 举个列子 1 a = raw_input(">>>") 2 if a == "h ...

  3. maven 插件深入了解

    http://www.infoq.com/cn/news/2011/04/xxb-maven-7-plugin http://www.infoq.com/cn/news/2011/05/xxb-mav ...

  4. iOS基础知识之类别

    本类从三个方面介绍iOS中的类别,分别是  什么是类别:类别的语法:类别的作用.具体内容如下: 一.类别: 类的补丁:当不能获取现有类的源码,但需要对现有类的功能进行补充时,这种情况下使用类别. 类别 ...

  5. idea 关闭代码自动折叠,形参提示,行数栏图标,启动不默认打开上次的项目

    1,代码自动折叠 1.1,File > setting > Editor > General > Code Folding 1.2,勾选右侧不想要折叠的代码部分 2,形参提示 ...

  6. 【ASP.NET 插件】Plupload多格式多文件上传实现

    由于工作需求,要实现一个多格式多文件的上传功能,而且需要.NET版本的,嘿嘿,终于还是实现了,网上搜了很久,找到一篇不错的博文:WEB版一次选择多个文件进行批量上传(Plupload)的解决方案,在此 ...

  7. <基础> PHP 字符串操作

    explode — 使用一个字符串分割另一个字符串 array explode ( string $delimiter , string $string [, int $limit ] ) implo ...

  8. vue格式化显示json数据

    已经是json格式数据的,直接用标签 <pre></pre>展示. 参考:https://www.jianshu.com/p/d98f58267e40

  9. 虚拟机centos NAT模式 配置静态ip

    主要的设置有1.配置ip地址段,2.配置NAT(网关.ip地址端.子网掩码),3.修改网卡配置文件(/etc/sysconfig/network-scripts/ifcfg-eth0 ),4.重启网卡 ...

  10. ReactiveX 学习笔记(6)条件操作符

    Conditional and Boolean Operators 本文的主题为处理 Observable 的条件和布尔操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...