什么是单例模式?

顾名思义,一个类只存在唯一的一个实例

采取一定的方法保证在整个的软件系统中,对某个类

只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。

1、饿汉式第一种:

- 写法简单、类加载时,完成了实例化,避免多线程同步问题

- 不能懒加载,如果一直没有使用过这个实例,就造成了内存占用的浪费,懒加载,就是说等我需要使用这个实例时,再执行初始化加载出来调用

- 可用,但是会浪费内存

- 饿汉本身已经非常形容这个静态加载的意思了,不过有没有使用这个实例,先吃了内存空间再说

public class Singleton01 {

    // 私有构造器
private Singleton01 (){} // 静态固定实例
private static final Singleton01 single = new Singleton01(); // 提供公开的提供实例方法即可
public static Singleton01 getInstance() {
return single;
}
}

简单饿汉

2、饿汉式第二种:

初始化过程放在了静态代码块,比上面更优先加载出来,其他一样

- 可用

public class Singleton01 {

    // 私有构造器
private Singleton01 (){} // 声明单例实例
private static Singleton01 instance; // 交给静态块加载
static { instance = new Singleton01(); } // 一样的获取方法
public static Singleton01 getInstance(){ return instance; }
}

饿汉二

3、懒汉式第一种

- 实现了懒加载行为,但是线程不安全,只能单线程

- 多线程如果没有进入if语句判断就会直接new新实例产生

- 禁止使用

public class Singleton {

   private Singleton (){}

   private static Singleton instance;

   // 如果instance为空 就new出来,反之直接返回
public static Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}

懒汉一

4、懒汉式第二种

- 解决线程不安全的问题

- 效率太低,每次获取实例都需要执行同步

- 能用,不推荐使用

public class Singleton {

   private Singleton (){}

   private static Singleton instance;

   // 给方法加锁,同步处理化
public static synchronized Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}

懒汉式二

5、懒汉式第三种

- 代码复杂,线程反而不安全

- 禁用

public class Singleton {

   private Singleton (){}

   private static Singleton instance;

   // 经过判断后枷锁实例,多线程直接跳过判断获取,还是会创建实例
public static Singleton getInstance(){
if (instance == null) synchronized (Singleton.class) { instance = new Singleton();}
return instance;
}
}

6、懒汉式第四种双重检查

- 解决线程安全

- 懒加载实现

- 效率较高

- 可用

public class Singleton {

   private Singleton (){}

   // 设置可见
private static volatile Singleton instance; // 二次检查
public static Singleton getInstance(){
if (instance == null) synchronized (Singleton.class) {
if (instance == null) instance = new Singleton();
}
return instance;
}
}

懒汉三双重检查

7、静态内部类实例

- 采用类加载的机制实现懒加载,同时避免了线程安全的问题

- 在调用方法时才会加载内部类返回实例

- 推荐

public class Singleton {

   private Singleton (){}

   // 静态内部类不会重复加载,其静态属性也如此
private static final class SingleInstanceClass{
private static final Singleton INSTANCE = new Singleton();
} // 返回内部类的属性实例即可
public static Singleton getInstance(){
return SingleInstanceClass.INSTANCE;
}
}

静态内部类

8、枚举,永远的神

- JDK1.5特性

- 线程绝对安全、实现单例

- 不能被序列化重新创建

- 推荐

public enum Singleton{
INSTANCE; public void ok(){
System.out.println("ok!");
}
}

Enum

Runtime经典的饿汉式

单例模式注意事项和细节说明

1) 单例模式保证了 系统内存中该类只存在一个对象,

  节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能

2) 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new

3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),

  但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)

【Java】【设计模式 Design Pattern】单例模式 Singleton的更多相关文章

  1. 《JAVA设计模式》之单例模式(Singleton)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...

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

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

  3. Java设计模式之《单例模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...

  4. Java设计模式之【单例模式】

    Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...

  5. Java设计模式中的单例模式

    有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...

  6. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  7. [Java复习] 设计模式 Design Pattern

    设计模式的六大原则 1.开闭原则(Open Close Principle) 对扩展开放,对修改关闭. 2.里氏代换原则(Liskov Substitution Principle) 任何基类可以出现 ...

  8. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  9. 重学 Java 设计模式:实战单例模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...

  10. [design pattern](7) Singleton

    前言 上面的章节中,我们介绍了工厂模式,它是创建型模式的一种.本章我们将会介绍 单例模式 ,它也是创建型模式的一种.单例模式是我们比较常用的一个设计模式,也是最简单的一种设计模式. 单例模式 介绍:确 ...

随机推荐

  1. 认识Oracle数据库系统--详细解说

    1.3 认识Oracle数据库系统 Oracle数据库是美国Oracle公司的一款关系型数据库管理系统,简称为Oracle RDBMS,是目前数据库市场上最为强大和流行的数据库系统之一.Oracle是 ...

  2. C语言实现strcat / strlen / strcmp / strcpy

    主要考虑两点: 返回值对使用的便利性. 边界,null的判断. strcat char *m_strcat(char *des, const char *src) { assert((des != N ...

  3. CF1327A Sum of Odd Integers 题解

    原题链接 简要题意: 多组数据,问能否把 \(n\) 分为 \(k\) 个 不同的 正奇数之和. 盲猜数学结论题. 只要考虑两个问题: \(n\) 的大小是否足够. \(n\) 的奇偶性是否满足. 对 ...

  4. java 为什么重写equals一定要重写hashcode?

    前言 最近复习,又看到了这个问题,在此记录和整理,通过例子来说明这种情况的原因,使大家可以清晰明白这个问题. 初步探索 首先我们要了解equals方法是什么,hashcode方法是什么. equals ...

  5. Spark作业提交至Yarn上执行的 一个异常

    (1)控制台Yarn(Cluster模式)打印的异常日志: client token: N/A         diagnostics: Application application_1584359 ...

  6. 03.第一个Go程序

    第一个Go程序 Hello World 现在我们来创建第一个Go项目--hello.在我们的GOPATH下的src目录中创建hello目录. 在该目录中创建一个main.go文件: package m ...

  7. django中 对Mysql数据库的建表

    Django操作Mysql数据库: 1.1 在settings中,配置数据库相关参数,所以无需修改,这里我们看一下: DATABASES = { 'default': { # 这里可以指定使用的数据库 ...

  8. [codevs2597]团伙<并查集>

    题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...

  9. warning: directory not found for option“XXXXXX” 解决方案

    从项目中删除了某个目录.文件以后,编译出现警告信息:   ld: warning: directory not found for option"XXXXXX" 很奇怪,为什么已经 ...

  10. 为什么我建议每个开发人员都需要学Python?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/10-reasons-why-every-d ...