码迷,mamicode.com
首页 > 编程语言 > 详细

单例模式与多线程

时间:2016-11-25 07:39:57      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:单例模式与多线程

程序代码:

技术分享


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


技术分享


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


技术分享


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


技术分享


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


技术分享


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


技术分享


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



本文出自 “学海无涯 心境无限” 博客,请务必保留此出处http://zhangfengzhe.blog.51cto.com/8855103/1876404

单例模式与多线程

标签:单例模式与多线程

原文地址:http://zhangfengzhe.blog.51cto.com/8855103/1876404

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!