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. leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划

    如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...

  2. JS高级程序设计第3章--精简版

    前言:纯手打!!!按照自己思路重写!!!这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了..所以还是博客好== 第三章:基本概念(语法.数据类型.流控制语句.函数) 3 ...

  3. 使用开源框架Sqlsugar结合mysql开发一个小demo

    一.Sqlsugar简介 1.性能上有很大优势 sqlsugar是性能最好的ORM之一,具有超越Dapper的性能 ,走的是EMIT够构中间语言动态编译到程序集,完成高性能的实体绑定,达到原生水平. ...

  4. [MySQL]快速解决"Table '.\sjzlf\zbp_post' is marked as crashed and should be repaired"故障

    为了不冒失修复,故采取保守做法,我们知道 MySQL 一个高效的管理工具便是 PhpMyAdmin,而在该管理软件中就包含了对表的检查.分析.修复.优化功能,比起网上提供的含糊命令行来说更安全更简便. ...

  5. CDQZ集训DAY4 日记

    早上起来之后发现座位被zzh占了,得知座位改为先来后到,什么鬼…… 于是去了另一个有耳机的机房,然而并没有什么卵用. T1上来感觉很有意思,先切50分再说.T2好像是原题的说,切了原题30分后大胆猜测 ...

  6. 【POJ - 1573】Robot Motion

    -->Robot Motion 直接中文 Descriptions: 样例1 样例2 有一个N*M的区域,机器人从第一行的第几列进入,该区域全部由'N' , 'S' , 'W' , 'E' ,走 ...

  7. Jenkins+Sonar搭建持续集成和代码质量检查环境

    Jenkins+Sonar搭建 一.相关环境及下载地址 系统:Ubuntu JDK:1.8 MySQL:5.7 软件包: jenkins_2.121.3_all.deb sonarqube-7.3.z ...

  8. 下拉选择框,PopupWindow的使用

    实现下拉选择框 直接上代码 Activity.java package com.example.shaofei.customerviewdemo1; import android.os.Bundle; ...

  9. c语言进阶6-指针

    指针是c语言的一个重要组成部分 是c语言的核心.精髓所在,用好指针可以在c语言编程中起到事半功倍的效果.一方面,可以提高程序的编译效率和执行速度以及实现动态的存储分配:另一方面,使用指针可使程序更灵活 ...

  10. 一文带你实现RPC框架

    想要获取更多文章可以访问我的博客 - 代码无止境. 现在大部分的互联网公司都会采用微服务架构,但具体实现微服务架构的方式有所不同,主流上分为两种,一种是基于Http协议的远程调用,另外一种是基于RPC ...