定义

单例模式,属于创建类型的一种常用的软件设计模式。
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”

饿汉式 与 懒汉式

饿汉式:类装载的时候就完成实例化。避免了线程同步问题。可能造成内存浪费。
懒汉式:延迟加载,只有在用到的时候才进行实例化。存在线程不安全问题。

单例模式实现要点

  1. 创建静态属性存放实例
  2. 构造方法私有化,使外部无法new创建实例对象
  3. 提供公有静态方法获取实例对象

单例模式的五种实现方式

单例模式常见五种实现:饿汉式、枚举饿汉式、懒汉式、双检锁懒汉式、内部类懒汉式。

1、饿汉式(可用)

/*** @author chenxp* 1. 饿汉式单例*/
public class Singleton1 {private static final Singleton1 INSTANCE = new Singleton1();private Singleton1(){}public static Singleton1 getInstance() {return INSTANCE;}
}

2、枚举饿汉式(推荐)

/*** @author chenxp* 2. 枚举饿汉式单例*/
public enum Singleton2 {INSTANCE;// 可省略private Singleton2() {}// 可省略public static Singleton2 getInstance() {return INSTANCE;}
}

3、懒汉式(不推荐)

/*** @author chenxp* 3. 懒汉式单例*/
public class SingleTon3 {private static SingleTon3 INSTANCE = null;private SingleTon3() {}public static synchronized SingleTon3 getInstance() {if (INSTANCE == null) {INSTANCE = new SingleTon3();}return INSTANCE;}
}

4、双检锁懒汉式(推荐)

/*** @author chenxp* 4. 双检锁-懒汉式单例*/
public class Singleton4 {/*** volatile 保证可见性、有序性,防止指令重排序*/private static volatile Singleton4 INSTANCE = null;private Singleton4() {}public static Singleton4 getInstance() {if (INSTANCE == null) {synchronized (Singleton4.class) {if (INSTANCE == null) {INSTANCE = new Singleton4();}}}return INSTANCE;}
}

5、内部类懒汉式(推荐)

/*** @author chenxp* 5. 内部类懒汉式单例*/
public class Singleton5 {private Singleton5() {}private static class Holder {static Singleton5 INSTANCE = new Singleton5();}public static Singleton5 getInstance() {return Holder.INSTANCE;}
}

使用场景

  1. 需要频繁的进行创建和销毁的对象;
  2. 创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象;
  3. 工具类对象;
  4. 频繁访问数据库或文件的对象(比如数据源、session工厂等)。

扩展

可能破坏单例三种方式:
①反射破坏单例
②反序列破坏单例
③Unsafe 破坏单例

Java 单例模式常见五种实现方式相关推荐

  1. Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解

    源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...

  2. Java单例模式的几种实现方式

    Java单例模式的几种实现方式 在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例.Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几 ...

  3. 后端技术:Java定时任务的五种创建方式

    Quartz表达式生成地址:http://cron.qqe2.com/ 支持生成定时任务表达式和反解析,使用Quartz表达式的定时任务如下 xxl-job springboot 的 @Schedul ...

  4. java jdbc数据库五种连接方式

    jdbc数据库连接方式(迭代) 方式五为最终版本 方式一 @Testpublic void testConnection() throws SQLException { // 1.获取Driver的实 ...

  5. python单例模式的五种实现方式

    __new__特殊方法实现 class Singleton:def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):cls ...

  6. java创建对象的五种方式

    java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...

  7. 关于线程池的五种实现方式,中软国际Java机试

    在这里,还有创建一个只有单个线程的可以定时执行线程池(Executors.newSingleThreadScheduledExecutor())这些都是上面的线程池扩展开来了,不详细介绍了. 3 介绍 ...

  8. JS 跨域问题常见的五种解决方式

    JS 跨域问题常见的五种解决方式 一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来 ...

  9. Java防止Xss注入json_XSS的两种攻击方式及五种防御方式

    XSS介绍 跨站脚本攻击指的是自己的网站运行了别的网站里面的代码 攻击原理是原本需要接受数据但是一段脚本放置在了数据中: 该攻击方式能做什么? 获取页面数据 获取Cookies 劫持前端逻辑 发送请求 ...

最新文章

  1. AJAXA进行分页(2)
  2. to_char 函数将小数点舍掉的解决办法
  3. DiskFileItemFactory API详解
  4. Mantis-如何自定义流程状态
  5. oracle两个约束,Oracle中的约束介绍(2)
  6. 公钥和私钥的作用和区别
  7. LoadRunner教程(12)-LoadRunner IP欺骗
  8. 人工智能研究中深度学习的局限性
  9. 企业微信自定义应用页面授权过程
  10. 【12月26日】A股滚动市盈率PE最低排名
  11. leetcode:460. LFU最不常用缓存
  12. 微软客服的痛苦-还敢应聘微软客服
  13. Smmu硬件寄存器—V2
  14. blender2.8 使用教程 贴图纹理快捷键等。
  15. 白杨流量汇线下聚会品茶聊流量,搞流量的核心是什么?
  16. hihocoder1636-Pangu and Stones
  17. irobot扫地机器人 电压_iRobot Roomba 770 智能扫地机器人(宽幅电压)
  18. 计算机一级操作题题库在线,全国计算机一级考试题库操作题
  19. hadoop好博集锦
  20. OpenCL框架组成

热门文章

  1. 机遇与挑战并存,神画科技玩转智能投影并不易
  2. proxy-wasm-cpp-sdk 编译
  3. 怎么打开苹果的扫描功能?
  4. linux命令合并文本为一行,awk实际应用:文本合并
  5. 目前最好的,以rtmp发送264到red5服务器的代码,darkdragonking亲测可用--《到H264视频通过RTMP直播》
  6. Linux vim多行操作
  7. 回购国内股份,改回中国国籍,93岁的李嘉诚葫芦里卖的什么药?
  8. Cheez布局海外短视频市场 凭美摄短视频SDK取爆发式进展
  9. 46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)
  10. unity开发炉石传说系列玩家手中卡牌出入及移动排列代码