java设计模式-单例模式
时间:2022-07-22
本文章向大家介绍java设计模式-单例模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式
其定义为:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
实现单例模式的方式
单例模式的实现方式有很多,主要有饿汉模式,懒汉模式,静态内部类,注册登记模式以及通过实现序列化也可以实现单例模式。
饿汉模式
public class Hungry {
private Hungry(){}
private static final Hungry hungry = new Hungry();
public static Hungry getInstance(){
return hungry;
}
}
懒汉模式
//在外部需要使用的时候才进行实例化
public class LazyOne {
private LazyOne(){}
//静态块,公共内存区域
private static LazyOne lazy = null;
public static LazyOne getInstance(){
//调用方法之前,先判断
//如果没有初始化,将其进行初始化,并且赋值
//将该实例缓存好
if(lazy == null){
lazy = new LazyOne();
}
//如果已经初始化,直接返回之前已经保存好的结果
return lazy;
}
}
静态内部类
public class LazyThree {
//默认使用LazyThree的时候,会先初始化内部类
//如果没使用的话,内部类是不加载的
private LazyThree(){}
//static 是为了使单例的空间共享
//保证这个方法不会被重写,重载
public static final LazyThree getInstance(){
//在返回结果以前,一定会先加载内部类
return LazyHolder.LAZY;
}
//默认不加载
private static class LazyHolder{
private static final LazyThree LAZY = new LazyThree();
}
}
注册登记模式
//注册式单例
public class RegisterMap_bxc {
//相当于本地缓存
private static Map<String,Object> regist = new HashMap<String,Object>();
public static RegisterMap_bxc getInstance(String name)
{
if(null == name)
{
name = RegisterMap_bxc.class.getName();
}
synchronized (regist)
{
if(!regist.containsKey(name))
{
regist.put(RegisterMap_bxc.class.getName(),new RegisterMap_bxc());
}
return (RegisterMap_bxc)regist.get(name);
}
}
}
总结
饿汉模式:
优点:饿汉模式是线程安全的,而且执行效率比较高,从用户的体验来说比懒汉好
缺点:因为它在类加载的时候就初始化了,不管是否用到,所以饿汉模式浪费系统资源
懒汉模式:
优点:在类加载的时候不会初始化,只有当调用的时候才会初始化,所以比较节约资源
缺点:线程不安全,高并发的情况下容易出错
静态内部类:
可以说静态内部类综合了懒汉和饿汉模式,在外部类调用的时候,内部类才会被初始化,而且避免了线程安全性的问题
注册登记模式:
spring中就是用这种方法来管理实例的,目前对源码还在研究中,这里就不多说了。
- 碎片化 | 第四阶段-55-OpenSessionInViewFilter组件配置解决session问题-视频
- 入门Webpack(上)
- 碎片化 | 第四阶段-56-ManyToOne和OneToMany映射关系-视频
- 基于网络流量的SDN最短路径转发应用
- 碎片化 | 第四阶段-57-hibernate二级缓存-视频
- NoSQL篇 | NoSQL从小白到码神 之 Redis篇
- Neutron和ONOS集成实践
- 基于OpenDaylight和OVSDB搭建VxLAN网络
- 史上最强----机器学习经典总结---入门必读
- SDNLAB群分享(四):利用ODL下发流表创建VxLAN网络
- Neutron集成ONOS源码分析
- “访问限制”&“代理访问”实验
- OpenDaylight Lithium-SR2 Cluster集群搭建
- Linux | CentOS7下会玩JDK不?你确定?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 带你认识Pytest(三)
- Additive Powers-of-Two (APoT) Quantization:硬件友好的非均匀量化方法
- Flutter基础widgets教程-SnackBar篇
- Redash 二开 - 后端环境搭建
- Flutter基础widgets教程-Stepper篇
- Flutter基础widgets教程-Switch篇
- 13.深入k8s:Pod 水平自动扩缩HPA及其源码分析
- python 协程新版
- 14.深入k8s:kube-proxy ipvs及其源码分析
- netty
- Flutter基础widgets教程-TabBar篇
- 厉害了!华为将发布国产编程语言,打破国外垄断!
- Flutter基础widgets教程-TabBarView篇
- 求求你不要在用!=null判空了
- Geant4--root和csv文件存储