什么是Singleton?
Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一。
单:指唯一
例:指实例
单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。
要点:
一、单例类只能有一个实例
- 保证构造器私有化(防止通过构造器实例化)
二、单例类必须自信创建这个实例
- 在单例类中创建一个静态变量来保存这个唯一的实例
三、单例类必须自行向整个系统提供这个实例
- 对外提供该实例对象的获取方式
- 直接暴露该实例对象
- 用静态变量的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?的更多相关文章
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- PHP设计模式(四)单例模式(Singleton For PHP)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
- The Java Enum: A Singleton Pattern [reproduced]
The singleton pattern restricts the instantiation of a class to one object. In Java, to enforce this ...
- 最适合作为Java基础面试题之Singleton模式
看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...
- 每天一个设计模式-4 单例模式(Singleton)
每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)
一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
随机推荐
- Quartz每次调度时被执行两次
[关键字:重复执行.重复调用.每次执行两次.执行2次] 前言: 先说一下,项目背景.由于组内某成员在用Maven搭建项目时不规范,导致项目的名称与实际访问项目名称不一致.在部署项目时,必需要配一下虚拟 ...
- HDU 3879 && BZOJ 1497:Base Station && 最大获利 (最大权闭合图)
http://acm.hdu.edu.cn/showproblem.php?pid=3879 http://www.lydsy.com/JudgeOnline/problem.php?id=1497 ...
- html手机自适应屏幕
<meta name="viewport" content="height=device-width, initial-scale=1.0, maximum-sca ...
- ajax 的简单请求,get的加法运算,post加法运算,用户登录认证
视图函数部分 from django.shortcuts import render, HttpResponse import time from app01.models import User i ...
- AD域和LDAP协议
随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下! 先简单的讲讲AD域 ...
- [Python学习]错误篇一
REFERENCE:<Head First Python> ID:我的第一篇[Python学习] BIRTHDAY:2019.7.6 EXPERIENCE_SHARING:两个程序错误类型 ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
- reportlab生成pdf
文档地址:https://www.reportlab.com/docs/reportlab-userguide.pdf 源码地址:https://bitbucket.org/rptlab/report ...
- python数据库查询转dataframe
1. 场景描述 python环境下需要从greenplum/postgresql中,获取算法执行的数据,但是从数据库中查询出来是数组格式的,算法无法使用,需要转换为dataframe格式. 2. 解决 ...
- request 中url拼接排序参数与签名算法
一.参数要求: { appId:应用在后台创建应用时分配的应用编号,与应用密钥一一对应 sign:按照当前请求参数名的字母序进行升序排列(排序时区分大小写,除sign外,其它值不为空的参数都参与签名) ...