面试题-JAVA设计模式之单例模式的5种实现方式
时间:2022-07-24
本文章向大家介绍面试题-JAVA设计模式之单例模式的5种实现方式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如果说Spring框架是乾坤大挪移,那么设计模式就是九阳神功,学会了九阳神功在学其他的武功就会非常容易,设计模式是解决复用性功能的一套经验方法,我们写代码的时候最忌讳写死,应该考虑复用性、扩展性,我们今天来说说设计模式中的单例模式,这也是最简单的一种模式,简单归简单,很多框架中都使用了单例模式,所以这个模式也非常重要。
单例模式
定义:单例模式属于创建型的设计模式,通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。
优点:单例只有一个实例,这样做节约系统资源、全局唯一。
缺点:因为单例是类,不是接口,所以扩展性差些。
适用场景:
1.windows系统中的资源管理器、回收站。
2.系统中的订单号生成单例类,笔者公司曾经使用单例双检索这种方式。
3.Spring框架中的bean一般都是默认单例,所有bean的请求都会返回这个唯一的实例。
4.mybais框架中的ErrorContext是用在每个线程范围内的单例,用于记录该线程的执行环境错误信息。
实现方式:
1.饿汉式:在类加载时就已经创建,无法延时加载,如果一直没有使用,可能会造成内存浪费,但是线程安全,调用效率高。
public class SingleTon {
//方式1:饿汉式
//类静态成员,类加载过程中创建,线程安全
private static SingleTon singleTon = new SingleTon();
private SingleTon(){}
public static SingleTon getSingleTon(){
return singleTon;
}
}
2.懒汉式:使用时再实例化对象。//方式2:懒汉式
//每次获取都需要检查,使用时加载,多线程访问会存在线程安全问题
private static SingleTon singleTon = null;
private SingleTon(){}
public static SingleTon getSingleTon(){
if(null==singleTon){
singleTon = new SingleTon();
}
return singleTon;
}
//synchronized效率较低
public static synchronized SingleTon getSingleTon(){
if(null==singleTon){
singleTon = new SingleTon();
}
return singleTon;
}
3.双重检索//方式3:双重检索
//两次判断+volatile(防止指令重排序)+synchronized(多线程锁)
private static volatile SingleTon singleTon = null;
private SingleTon(){}
public static SingleTon getSingleTon(){
if(null==singleTon){
synchronized (SingleTon.class){
if(null==singleTon){
singleTon = new SingleTon();
}
}
}
return singleTon;
}
4.内部类//方式4:内部类
//内部类在外部类调用的时候才加载,延迟加载,线程安全。
public class SingleTon {
//方式4:内部类
//内部类在外部类调用的时候才加载,延迟加载,线程安全。
public static class Holder{
public static SingleTon singleTon = new SingleTon();
}
public static SingleTon getSingleTon(){
return Holder.singleTon;
}
}
5.枚举方式public enum SingleTon {
//方式5:枚举类
//类加载时进行加载,一直没有使用,可能造成浪费
INSTANCE;
public static SingleTon getSingleTon(){
return INSTANCE;
}
}
- 腾讯云Fintech云端系列论坛首站北京,揭秘如何全链路赋能互联网金融
- Flask入门笔记(一)
- 刷脸还是指纹识别,that's a question
- c#:使用using关键字自动释放资源未必一定就会有明显好处
- MongoDB 学习笔记(原创)
- Silverlight:ScorllViewer随Tab键自动跟随子控件的Focus滚动
- 老域名做新站如何能快速得上首页?
- Silverlight:分包下载及SEO优化方案
- jQuery调用RESTful WCF示例(GET方法/POST方法)
- "RDLC"报表-参数传递及主从报表
- 初探小程序之运营及未来方向
- 微信小程序深夜开放NFC等连接能力,未来可直接刷公交?
- Silverlight:获取ContentTemplate中的命名控件
- silverlight向wcf传递大于8192字节(8k)的字符串
- 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 文档注释
- R海拾遗-sci配色
- Flutter框架分析(二)-- 初始化
- Flutter框架分析(三)-- Widget,Element和RenderObject
- 傅里叶变换的图像应用--学好了用处大~
- Flutter框架分析(四)-- Flutter框架的运行
- R海拾遗-流程图prismadiagramR
- R海拾遗-单项重复测量方差分析
- R海拾遗-双因素重复测量方差分析
- 小白秒变大神--windows窗口+装B神器大全 两部曲
- R海拾遗-三因素重复
- 推荐一种简单的在Flutter中分离View与Model的方法
- R海拾遗-tidyverse
- Flutter Hooks 使用及原理
- ggplot2_总纲
- 聊聊怎样学习Binder