设计模式————单例模式
发布日期:2022-02-27 02:37:55
浏览次数:55
分类:技术文章
本文共 2274 字,大约阅读时间需要 7 分钟。
作为一名Java开发,设计模式的掌握与应用是必不可少的,而单例模式可以说是作为Java入门或者初级人员常使用到的设计模式之一;
首先说一说单例模式的几种实现方式,并进行一一的讲解:
1,单例模式————饿汉模式:饿汉模式,见名知意,带有一种迫切的意思,也可说是迫切加载,简单来说就是在类加载时就会创建好实例对象(使用前提前进行实例化)
class SingleTest { // 创建当前实例,并进行私有化 private static SingleTest singleTest = new SingleTest(); // 私有化构造方法 private SingleTest(){} // 静态的公共方法返回当前实例 public static SingleTest getSingle(){ return singleTest; }}
2,单例模式————懒汉模式:这个根据名字也就好理解了,懒汉懒汉,就一个字:懒,也可说懒加载,就是在使用对象时才会进行实例化
首先看一看初始版本;
class SingleTest { // 不进行实例化 private static SingleTest singleTest = null; // 私有化构造方法 private SingleTest(){} // 静态的公共方法返回实例,判断实例是否为空 public static SingleTest getSingle(){ if(singleTest == null){ singleTest = new SingleTest(); } return singleTest; }}
其实上面的getSingle()方法是有一定的缺陷的,因为在并发的情况下可能会出现创建多个实例的情况,所以还需要进行改进;
class SingleTest { // 不进行实例化 private static SingleTest singleTest = null; // 私有化构造方法 private SingleTest(){} // 静态的公共方法返回实例,判断实例是否为空 public static SingleTest getUser(){ if(singleTest == null){ synchronized (SingleTest.class){ singleTest = new SingleTest(); } } return singleTest; }}
如上是在singleTest为空时才会去获取锁,锁并没有加在判断外是因为完全没必要的,极大的消耗时间且设计也并不合理,但是还是有一个小的问题,就是说在判断后的并发下,会有多次去获取锁,也会造成多次实例化,从而得到不同的对象;
使用双重判断加上锁机制,我们再来看一下能否解决:
class SingleTest { // 不进行实例化 private static SingleTest singleTest = null; // 私有化构造方法 private SingleTest(){} // 静态的公共方法返回实例,判断实例是否为空 public static SingleTest getUser(){ if(singleTest == null){ synchronized (SingleTest.class){ if(singleTest == null){ singleTest = new SingleTest(); } } } return singleTest; }}
这样的方法确实能解决这个问题,但是由于JVM底层模型原因,偶尔会出问题,不建议使用;
3,静态内部类实现模式:对于这种方案,线程安全,调用效率高,可以延时加载
class SingleTest { // 静态内部类 private static class SingleInstance{ private static final SingleTest singleTest = new SingleTest(); } // 私有化构造方法 private SingleTest(){} // 获取实例 public static SingleTest getInstance(){ return SingleInstance.singleTest; }}
4,枚举实现单例:线程安全,调用的效率高,但是不能延时加载,可以防止反射和反序列化的调用
enum SingleTest { // 本身就是单例 INSTANCE; // 可以去实现一些其他操作}
以上是简单的聊了一下单例模式,以及其中的一些优缺点;今天心情不太好,就到这吧。。。
转载地址:https://blog.csdn.net/weixin_43398098/article/details/122986069 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月14日 14时09分26秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
kivy制作安卓APP--简单音乐播放器
2019-04-26
十年(程序员改编)
2019-04-26
c++排序算法个人总结
2019-04-26
看完你就知道的乐观锁和悲观锁
2019-04-26
Docker入门
2019-04-26
Spring Aop 扫盲
2019-04-26
看完这篇操作系统,和面试官扯皮就没问题了
2019-04-26
安卓开发入门教程-Fragment
2019-04-26
安卓自定义对话框(弹出框)并添加显示动画
2019-04-26
安卓开发入门教程-运行时权限
2019-04-26
安卓开发入门教程-UI控件_ProgressBar
2019-04-26
安卓开发入门教程-UI控件_SeekBar
2019-04-26
安卓开发入门教程-UI控件_AlertDialog
2019-04-26
安卓开发入门教程-Fragment
2019-04-26
安卓使用selector定制复选框(checkbox)
2019-04-26
安卓开发手电筒应用(打开或关闭闪光灯)
2019-04-26
安卓开发入门教程-UI控件_Switch
2019-04-26
安卓开发入门教程-UI控件_ProgressBar
2019-04-26
安卓开发入门教程-UI控件_RecyclerView
2019-04-26