Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一。

单:指唯一

例:指实例

单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。

要点:

一、单例类只能有一个实例

  • 保证构造器私有化(防止通过构造器实例化)

二、单例类必须自信创建这个实例

  • 在单例类中创建一个静态变量来保存这个唯一的实例

三、单例类必须自行向整个系统提供这个实例

  • 对外提供该实例对象的获取方式
  1. 直接暴露该实例对象
  2. 用静态变量的get方法获取该实例对象

单例的几种常见形式

饿汉式:直接创建对象,不存在线程安全问题

  • 直接实例化饿汉式(简介直观)
 /**
* 单例饿汉式一(1)
* 直接实例化饿汉式(简洁直观)
* 对外提供获取该实例对象的方式:
* (1)直接暴露
* (2)用静态变量的get方法获取
*/
public class SingletonHungry1 { public static final SingletonHungry1 INSTANCE = new SingletonHungry1(); private SingletonHungry1() {}
} /**
* 单例饿汉式一(2)
* 直接实例化饿汉式(简洁直观)
* 对外提供获取该实例对象的方式:
* (1)直接暴露
* (2)用静态变量的get方法获取
*/
public class SingletonHungry2 { private static final SingletonHungry2 INSTANCE = new SingletonHungry2(); private SingletonHungry2() {} public static SingletonHungry2 getInstance() {
return INSTANCE;
}
}
  • 枚举式(最简洁)
 /**
* 单例饿汉式二
* 枚举式(最简洁)
*/
public enum SingletonHungry3 {
INSTANCE
}
  • 静态代码块饿汉式(适合复杂实例化)
 /**
* 单例饿汉式三
* 静态代码块饿汉式(适合复杂实例化)
*/
public class SingletonHungry4 { public static final SingletonHungry4 INSTANCE; private String info; static {
// 这里用来实现复杂的实例化
// ......复杂代码
try {
Properties pro = new Properties();
pro.load(SingletonHungry4.class.getClassLoader().getResourceAsStream("singleton.properties"));
INSTANCE = new SingletonHungry4(pro.getProperty("info"));
} catch (IOException e) {
throw new RuntimeException(e);
}
} private SingletonHungry4(String info) {
this.info = info;
}
}

懒汉式:延迟创建对象

  • 线程不安全(适用于单线程)
 /**
* 单例懒汉式一
* 线程不安全(适用于单线程)
*/
public class SingletonLazy1 { private static SingletonLazy1 INSTANCE; private SingletonLazy1() {} public static SingletonLazy1 getInstance() {
if (INSTANCE == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
INSTANCE = new SingletonLazy1();
}
return INSTANCE;
}
}
  • 线程安全(适用于多线程)
 /**
* 单例懒汉式二(1)
* 线程安全(适用于多线程)
*/
public class SingletonLazy2 { private static SingletonLazy2 INSTANCE; private SingletonLazy2() {} public static SingletonLazy2 getInstance() {
synchronized (SingletonLazy2.class) {
if (INSTANCE == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
INSTANCE = new SingletonLazy2();
}
}
return INSTANCE;
}
} /**
* 单例懒汉式二(2)
* 线程安全(适用于多线程,优化效率)
*/
public class SingletonLazy3 { private static SingletonLazy3 INSTANCE; private SingletonLazy3() {} public static SingletonLazy3 getInstance() {
if (INSTANCE == null) { // 不等于空直接返回,提高效率
synchronized (SingletonLazy3.class) {
if (INSTANCE == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
INSTANCE = new SingletonLazy3();
}
}
} return INSTANCE;
}
}
  • 静态内部类形式(适用于多线程)
    在内部类被加载和初始化时,才创建INSTANCE实例对象
   静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的
   因为是在内部类加载和初始化时创建的,因此是线程安全的
 /**
* 单例懒汉式三
* 静态内部类(适用于多线程)
* 在内部类被加载和初始化时,才创建INSTANCE实例对象
* 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的
* 因为是在内部类加载和初始化时,创建的,因此是线程安全的
*/
public class SingletonLazy4 { private SingletonLazy4() {} private static class Inner {
private static final SingletonLazy4 INSTANCE = new SingletonLazy4();
} public static SingletonLazy4 getInstance() {
return Inner.INSTANCE;
}
}

本文用于记录Singleton的学习,方便以后回顾!学完的东西容易忘,以文章的形式记录下来。欢迎大家学习和指出文章中的错误,谢谢!

示例代码-码云

什么是Singleton?的更多相关文章

  1. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  2. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  3. PHP设计模式(四)单例模式(Singleton For PHP)

    今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...

  4. The Java Enum: A Singleton Pattern [reproduced]

    The singleton pattern restricts the instantiation of a class to one object. In Java, to enforce this ...

  5. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  6. 每天一个设计模式-4 单例模式(Singleton)

    每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...

  7. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

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

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

  9. C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

    一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...

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

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

随机推荐

  1. 安装Win10,ERROR_0x8007025D问题解决

    Windows10安装的时候,出现ERROR CODE:0x8007025D 大概提示为:windows 无法安装所需的文件.请确保安装所需的所有文件可用,并重新启动安装. 本人在出现这个问题的原因, ...

  2. ReentrantLock源码的一点总结

    ReentrantLock 是可重入锁,可重入锁的意思就是同一个线程可以重复获得该锁. 如何做到可重复获得该锁?计数器实现. 第一次加锁,cas比较是不是0,是0设置为1,并设置当前拥有锁的线程: 第 ...

  3. 数据结构-双向链表(Python实现)

    数据结构在编程世界中一直是非常重要的一环,不管是开发还是算法,哪怕是单纯为了面试,数据结构都是必修课,今天我们介绍链表中的一种--双向链表的代码实现. 好了,话不多说直接上代码. 双向链表 首先,我们 ...

  4. Redis图形化客户端管理软件推荐

    Redis是一个超精简的基于内存的键值对NOSQL数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库.不过它公自带一个最小化的命令行式的数据库管理工具re ...

  5. MyBatis从入门到精通:select较深层次的用法

    一,简单的情形 需求: 根据用户id获取用户拥有的所有角色,返回的结果为角色集合. 1.接口中增加的方法: List<SysRole> selectRolesByUserId(Long u ...

  6. TF项目实战(SSD目标检测)-VOC2007

    TF项目实战(SSD目标检测)-VOC2007 训练好的模型和代码会公布在网上: 步骤: 1.代码地址:https://github.com/balancap/SSD-Tensorflow 2.解压s ...

  7. python函数知识二 动态参数、函数的注释、名称空间、函数的嵌套、global,nonlocal

    6.函数的动态参数 *args,**kwargs:能接受动态的位置参数和动态的关键字参数 *args -- tuple *kwargs -- dict 动态参数优先级:位置参数 > 动态位置参数 ...

  8. Git常用操作指南

    目录 前言 Git简介 安装之后第一步 创建版本库 本地仓库 远程仓库 版本控制 工作区和暂存区 版本回退 撤销修改 删除文件 分支管理 创建与合并分支 解决冲突 分支管理策略 状态存储 多人协作 R ...

  9. .NET 欢乐编程术之类型超级转换之术👍👍

    准备工作:先确保 VS 版本大于 2017,且支持C# 7.0 语言版本.然后新建 .Net Core 项目,在 Nuget 包管理上引入微软霸霸官方包 System.Runtime.Compiler ...

  10. linux初学者-磁盘拉伸缩减篇

    linux初学者-磁盘拉伸缩减篇 在系统的使用过程中,往往会出现这样的问题,由于刚开始无法估计需要的磁盘空间,导致后期磁盘空间不够,使得数据没地方存储,又或者后期磁盘空间过大,造成资源的浪费.这种在使 ...