我们可以发现,在上面代码中,使用了static 修饰了成员变量instance,在类初始化阶段中static 修饰了成员变量instance,在多线程的情况下能保证只实例化一次。

这种方式实现的单例模式,在类初始化阶段就已经在堆内存中分配了一块,用于存放实例化对象,所以也称为饿汉模式。

然而饿汉模式在类成员变量比较多,或变量比较大的情况下,可能会在没有使用类对象的情况下,一直占用堆内存。试想下,如果一个开源框架中的所有类都是基于饿汉模式实现的单例,这将会初始化所有单例类。将会占据堆中很大一部分空间,对系统性能来说无疑是灾难性的。

懒汉模式

//懒汉模式
public final class Singleton {private static Singleton instance= null;//不实例化private Singleton(){}//构造函数public static Singleton getInstance(){//通过该函数向整个系统提供实例if(null == instance){//当instance为null时,则实例化对象,否则直接返回对象instance = new Singleton();//实例化对象}return instance;//返回已存在的对象}
}

以上代码在单线程下运行是没有问题的,但要在多线程下,就会出现实例化多个类对象的情况。原因如下:

两个线程A和B同时运行这个getinstance方法,当线程A进入到if 判断条件后,开始实例化对象,此时instance 依然为null;同时有线程B进入到if判断条件中,之后也会通过条件判断,进入到方法里面创建一个实例对象。

这里我们使用synchronized同步锁来修饰getinstance方法:

//懒汉模式 + synchronized同步锁
public final class Singleton {private static Singleton instance= null;//不实例化private Singleton(){}//构造函数public static synchronized Singleton getInstance(){//加同步锁,通过该函数向整个系统提供实例if(null == instance){//当instance为null时,则实例化对象,否则直接返回对象instance = new Singleton();//实例化对象}return instance;//返回已存在的对象}
}

通过内部类实现

我们知道,在饿汉模式中,使用的static修饰了成员变量instance,在类初始化阶段中static 修饰了成员变量instance,在多线程的情况下能保证只实例化一次,其它线程将会被阻塞等待。这种方式可以保证原子性。

这种方式,只有在第一次调用getinstance()方法时,才会加载innersingleton类,而只有在加载内部类innersingleton之后,才会实例化创建对象。具体实现如下:

//懒汉模式基于内部类实现
public final class Singleton {public List<String> list = null;// list属性private Singleton() {//构造函数list = new ArrayList<String>();}// 内部类实现public static class InnerSingleton {private static Singleton instance=new Singleton();//自行创建实例}public static Singleton getInstance() {return InnerSingleton.instance;// 返回内部类中的静态变量}
}

饿汉模式和懒汉模式作为单例的实现方式,我们可以根据自己的需求来做选择。

如果我们在程序启动后,一定会加载到类,那么用饿汉模式实现的单例简单又实用;如果我们是写一些工具类,则优先考虑使用懒汉模式,因为很多项目可能会引用到jar包,但未必会使用到这个工具类,懒汉模式实现的单例可以避免提前被加载到内存中,占用系统资源。

如果喜欢本文,可以关注我们的官方账号,第一时间获取资讯。
你的关注是对我们更新最大的动力哦~

今日福利(点击下方文字超链接获取)

最后

需要的朋友可以点击:戳这里免费领取

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。

2021Java面经:【漫画(2)相关推荐

  1. 不要千言万语,一组漫画让你秒懂最终一致性

    直接上图 如果你以前看过最终一致性的定义那么你一定会为这幅精彩漫画拍手叫好. 你要是不知道什么是最终一致性你可以看看下面的权威定义,当然了网上关于什么是最终一致性的帖子铺天盖地,也许你已经很明白了,即 ...

  2. android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码...

    Android精选源码 一个可以上拉下滑的Ui效果,觉得好看可以学学 APP登陆页面适配 一款采用MVP的的完整漫画APP源码 android实现钉钉地图效果源码 一个使用单个文字生成壁纸图片的app ...

  3. 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程...

    下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的 ...

  4. 量子计算机 漫画,漫画 | 10分钟看懂量子比特、量子计算和量子算法

    原标题:漫画 | 10分钟看懂量子比特.量子计算和量子算法 请做好准备,即将进入烧脑模式! 宏观世界的生活经验很多都是表象.比如,你可能认为世界的运行是确定的.可预测的:一个物体不可能同时处于两个相互 ...

  5. 看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画

    作者 | 神经小兮 来源 | HyperAI超神经 头图 | 下载于视觉中国 把影视剧变成漫画,是怎样的一种神操作?来自大连理工大学和香港城市大学的团队,最新提出的 AI 框架,可自动将影视剧转换为漫 ...

  6. 漫画:有趣的海盗问题 (完整版)

    -----  第二天  ----- 海盗分金币问题: 有5个海盗,获得了100枚金币,于是他们要商量一个方法来分配金币.商议方式如下: 1. 由5个海盗轮流提出分配方案. 2. 如果超过半数海盗(包括 ...

  7. 漫画:什么是LRU算法?

    本期封面作者:A17 -----  两个月前  ----- 用户信息当然是存在数据库里.但是由于我们对用户系统的性能要求比较高,显然不能每一次请求都去查询数据库. 所以,小灰在内存中创建了一个哈希表作 ...

  8. 漫画讲述人工智能简史

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑ 作者 | 武博士.宋知达.袁雪瑶.聂文韬 来源 | 大鱼AI(id:DayuAI-Founder) ...

  9. 漫画 | 如果程序员的妈是产品经理,她会如何逼你结婚?

    以下文章来源方志朋的博客,回复"666"获面试宝典 在日常工作中 我们接触最多的估计就是产品小姐姐了 她们个个都漂亮.温柔,善解人意 而且说话还好听呢?? 那么作为一名程序员 在某 ...

最新文章

  1. 访谈 | 杨卫华谈技术人成长,要善用社区提升自身影响力
  2. SpringBoot实用小技巧之动态设置SpringBoot日志级别 1
  3. java实现空心四边形_Java输入数值形成对应的平行四边形,正三角形,棱形,空心棱形...
  4. 【LeetCode】Remove Nth Node From End of List
  5. python有类似spring_Python的Spring与J的Spring相比
  6. java中action类是干嘛的_java中action的作用
  7. IDEA中安装TeaVM插件
  8. python print(chr(65))_python 内置函数
  9. POJ2653 Pick-up sticks
  10. Linux 日志查看常用命令
  11. 74cms v5.0.1漏洞
  12. K-mer频率分布图代码实现
  13. RAKsmart云服务器全场7折
  14. 别只关注M1芯片的苹果笔记本,iOS APP支持在 Mac上运行也是大事
  15. 计算机科学导论第三版——第一章课后习题(贝赫鲁兹·佛罗赞BehrouzForouzan)(渐水问个人答案笔记csdn)
  16. 仁义礼智信,忠孝廉耻勇
  17. 如何排除BGA焊接问题-AE版
  18. iPhone开发之SQLite 实现中文排序的教程
  19. 【Mongo】.wt文件数据恢复
  20. android 货币格式化,Android 国际货币格式化的示例代码

热门文章

  1. 个人Ubuntu安装配置
  2. 5款宝藏浏览器插件推荐,每一个都真香,一定要看到最后
  3. unity3d在UGUI中显示带表情的微信昵称
  4. html鼠标悬停超链接(头像、文字)显示提示信息
  5. 亚马逊运营技巧,卖家该如何提升BSR排名?
  6. 基于准反射学习的哈里斯鹰优化算法
  7. 找工作面试会遇到哪些坑(校招篇)
  8. 如何写15分钟的计时器
  9. 安卓京东自动炸年兽v4.1.1
  10. linux重装xorg,菜鸟恢复xorg.conf的菜方法