什么是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 ...
随机推荐
- MySQL之基础操作
一.安装 Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数 ...
- div+css 布局技巧总计
一.css 样式 1.float 首先需要了解块级元素(block element).每个块级元素都默认占用一行,在同一行只能添加一个块元素(float 除外).块级元素一般可以嵌套块级元素或者行内元 ...
- C++学习书籍推荐《Inside the C++ Object Model》下载
百度云及其他网盘下载地址:点我 作者简介 Stanley B. Lippman is Architect with the Visual C++ development team at Microso ...
- 谷歌浏览器 Google Chrome 70.0.3538.102 便携版
oogle Chrome 是由Google开发的一款设计简单.运行高效.支持扩展的浏览器,它基于高速WebKit/Blink内核和高性能JavaScript V8引擎,在支持多标签浏览的基础上,提供顺 ...
- Java 垃圾收集总结
概述 垃圾收集(Garbage Collection,GC),它不是Java语言的伴生产物,它的历史比Java还要久远. 人们主要思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何 ...
- Python PyQT5的入门使用
Python 3+ PyQT5的入门使用 窗口类型介绍 QMainWindow,QWidget和QDialog都是用来创建窗口的.可以直接使用也可以继承后再使用. QMainWindow 该类窗口可以 ...
- 源代码扫描工具Fortify SCA与FindBugs的简单对比
前段时间因为工作原因需要对java源代码进行扫描,现结合使用经验对静态代码扫描工具Fortify SCA与FindBugs进行一个简单的对比. 一.Fortify SCA Fortify SCA是由全 ...
- 【POJ - 1190】生日蛋糕 (dfs+剪枝)
Descriptions: 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为 ...
- re模块:模式匹配与正则表达式
一.用正则表达式查找文本模式 正则表达式,简称regex,是文本模式的描述方法.比如\d是一个正则表达式,用于表示一位0~9的数字.在一个模式后面加上花括号包围的数字n(如{n}),表示匹配这个模式n ...
- 最全caffe安装踩坑记录(Anaconda,nvidia-docker,Linux编译)
Anaconda,nvidia-docker,Linux三种方式安装caffe 1.Anaconda安装caffe 1.首先安装anaconda 2.创建虚拟环境(python2.7) conda c ...