博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式与多线程
阅读量:7197 次
发布时间:2019-06-29

本文共 591 字,大约阅读时间需要 1 分钟。

程序代码:

上面的就是典型的“饿汉模式”,就是急不可耐,一上来就初始化对象。那能不能使用的时候才实例化对象呢?也就是希望延迟加载,这就是所谓的“懒汉模式”。程序代码如下:

在并发情况下,多个线程同时“抵达” if判断这块,那么势必对象会被多次new。那么“懒汉模式”下,如何保证并发呢?简单来说,我们可以在getInstance方法上直接打上synchronized即可,如下:

要知道此时锁住的是class对象,多个线程之间单个进入方法执行,确实解决了问题。但是由于锁的级别是在方法上,那么每一次获取单例,都不得不加锁,效率太低,如何改进呢?

把synchronized的锁范围缩小,“貌似”解决了问题,实则不然。如果多个线程同时通过if判断,那么在synchronized处一个个的通过的话,显然会被new多次。因此,我们需要double check instance:

其实,除了上面的方式外,还有一种static inner class的方式,在保证多线程安全的情况下,更加高效、优雅:

通过静态内部类的方式,同样可以达到使用的时候才加载,而且完全避免了并发下的问题!在实际开发中也是使用最为广泛的!

本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1876404,如需转载请自行联系原作者

你可能感兴趣的文章
NumPy和Pandas常用库
查看>>
本文来自合作伙伴“阿里聚安全”.
查看>>
为TWaver HTML5的Tree组件增加鼠标滑过效果
查看>>
怎样收集有用的QQ号码为我所用
查看>>
hive-极致优化(二)-解释计划类别
查看>>
ajax跨域
查看>>
webpack4配置详解之常用插件分享
查看>>
phalcon7 阅读理解
查看>>
消息中间件 RocketMQ源码解析:Message顺序发送与消费
查看>>
Thread interrupt
查看>>
博客搬家至简书
查看>>
Linux上的free命令详解
查看>>
linux主目录下各个子目录的作用
查看>>
[问题]javax.servlet不存在的问题
查看>>
Hive学习总结之五:HBase和Hive的集成
查看>>
Windows7系统中启动Windows Event Log服务提示拒绝访问,错误5的解决方法
查看>>
mybatis--缓存(一级和二级缓存)
查看>>
centos 配置 nginx + fcgiwrap + git
查看>>
Eclipse下Maven打包非法字符问题
查看>>
FreeMarker标签
查看>>