什么是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 ...
随机推荐
- Docker环境下的前后端分离项目部署与运维(十二)使用Portainer管理Docker
安装 docker hub地址:https://hub.docker.com/r/portainer/portainer/ # 每台服务器都要安装 docker pull portainer/port ...
- vue中轮播图的实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- scrapy基础知识之发送POST请求:
可以使用 yield scrapy.FormRequest(url, formdata, callback)方法发送POST请求. 如果希望程序执行一开始就发送POST请求,可以重写Spider类的s ...
- 为什么QQ能上却打不开网页呢?
互联网是一个复杂又有趣的玩意儿,接下来我来分享一个案例: 网页打不开,但奇怪的是QQ可以正常使用??? 网页打不开的原因:电脑上Tcp/IP设置中没有使用自动分配的DNS服务器,而且自行设定的DNS服 ...
- ElasticSearch核心概念和文档的CRUD
目录 1. 基本概念 1.1 Node 与 Cluster 1.2 Index 1.3 Document 1.4 Type(将在ES6.0移除) 2. 数据的增删改查 2.1 添加数据 2.2 查询数 ...
- scala刷LeetCode--26 删除排序数组中的重复项
一.题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完 ...
- Linux系统下word转pdf,xls转pdf,ppt转pdf
word转换pdf的技术方案,供参考.[doc/docx/ppt/pptx/xls/xlsx均支持转换] 本方案是Java结合shell命令完成,不同于以往的仅依赖java组件转换 ...
- 【UR #7】水题走四方 题解
链接:http://uoj.ac/problem/84 20分算法:萌萌的小爆搜,别搜进环里就行. 50分:我们考虑一下最优决策是什么样的.看似很显然的一点就是我们先让本体在原地不动,让分身去遍历子树 ...
- 微信小程序之楼层效果
今天做了一个小程序实现一个楼层效果 带大家分享下经验和api的使用吧 如图 将左边和右边各分了一个组件 目录如下 其中list页面是这个楼层效果的页面 components是组成这个页面的两个组件 ...
- Vue状态管理之Bus
一般在项目中,状态管理都是使用Vue官方提供的Vuex 当在多组件之间共享状态变得复杂时,使用Vuex,此外也可以使用Bus来进行简单的状态管理 1.1 父组件与子组件之间的通信 vue.config ...