Java 单例模式常见五种实现方式
定义
单例模式,属于创建类型的一种常用的软件设计模式。
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
饿汉式 与 懒汉式
饿汉式:类装载的时候就完成实例化。避免了线程同步问题。可能造成内存浪费。
懒汉式:延迟加载,只有在用到的时候才进行实例化。存在线程不安全问题。
单例模式实现要点
- 创建静态属性存放实例
- 构造方法私有化,使外部无法new创建实例对象
- 提供公有静态方法获取实例对象
单例模式的五种实现方式
单例模式常见五种实现:饿汉式、枚举饿汉式、懒汉式、双检锁懒汉式、内部类懒汉式。
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;}
}
使用场景
- 需要频繁的进行创建和销毁的对象;
- 创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象;
- 工具类对象;
- 频繁访问数据库或文件的对象(比如数据源、session工厂等)。
扩展
可能破坏单例三种方式:
①反射破坏单例
②反序列破坏单例
③Unsafe 破坏单例
Java 单例模式常见五种实现方式相关推荐
- Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解
源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...
- Java单例模式的几种实现方式
Java单例模式的几种实现方式 在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例.Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几 ...
- 后端技术:Java定时任务的五种创建方式
Quartz表达式生成地址:http://cron.qqe2.com/ 支持生成定时任务表达式和反解析,使用Quartz表达式的定时任务如下 xxl-job springboot 的 @Schedul ...
- java jdbc数据库五种连接方式
jdbc数据库连接方式(迭代) 方式五为最终版本 方式一 @Testpublic void testConnection() throws SQLException { // 1.获取Driver的实 ...
- python单例模式的五种实现方式
__new__特殊方法实现 class Singleton:def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):cls ...
- java创建对象的五种方式
java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...
- 关于线程池的五种实现方式,中软国际Java机试
在这里,还有创建一个只有单个线程的可以定时执行线程池(Executors.newSingleThreadScheduledExecutor())这些都是上面的线程池扩展开来了,不详细介绍了. 3 介绍 ...
- JS 跨域问题常见的五种解决方式
JS 跨域问题常见的五种解决方式 一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来 ...
- Java防止Xss注入json_XSS的两种攻击方式及五种防御方式
XSS介绍 跨站脚本攻击指的是自己的网站运行了别的网站里面的代码 攻击原理是原本需要接受数据但是一段脚本放置在了数据中: 该攻击方式能做什么? 获取页面数据 获取Cookies 劫持前端逻辑 发送请求 ...
最新文章
- AJAXA进行分页(2)
- to_char 函数将小数点舍掉的解决办法
- DiskFileItemFactory API详解
- Mantis-如何自定义流程状态
- oracle两个约束,Oracle中的约束介绍(2)
- 公钥和私钥的作用和区别
- LoadRunner教程(12)-LoadRunner IP欺骗
- 人工智能研究中深度学习的局限性
- 企业微信自定义应用页面授权过程
- 【12月26日】A股滚动市盈率PE最低排名
- leetcode:460. LFU最不常用缓存
- 微软客服的痛苦-还敢应聘微软客服
- Smmu硬件寄存器—V2
- blender2.8 使用教程 贴图纹理快捷键等。
- 白杨流量汇线下聚会品茶聊流量,搞流量的核心是什么?
- hihocoder1636-Pangu and Stones
- irobot扫地机器人 电压_iRobot Roomba 770 智能扫地机器人(宽幅电压)
- 计算机一级操作题题库在线,全国计算机一级考试题库操作题
- hadoop好博集锦
- OpenCL框架组成