《转》单例模式中的懒汉模式和恶汉模式的区别
2017-03-04 00:52
190 查看
分享转载来自:
http://blog.csdn.net/u012301841/article/details/50868456
单例模式在我们开发中经常会用到的,不知道你所喜欢用饿汉模式还是喜欢懒汉模式呢?为什么会出现有两种方式来实现单例模式?
我看这其中必蹊跷,你怎么看?
大家都知道的是:懒汉模式会通过 判 null,然后 new 出一个实例,也就是懒汉模式会延迟加载出实例对象。还有其他的区别吗?
我们来看一下懒汉模式和饿汉模式的实现代码。
[/code]
在饿汉模式中,初始化变量的时候最好加上 final 关键字,这样比较严谨。
[/code]
很多人奇怪,我的懒汉模式不是这样写的?为什么要这样写呢?
[/code]
一般这样写的,在大多数情况下这样写是没问题的。但是如果在多线程并发执行的时候,就会很容易出现安全隐患。
第一个线程进来判断 sInstance == null,还没有new 出实例的时候 。这个时候第二个线程也进来了,判断的sInstance 也是 null,然后也会 new 出实例的,这样就不是我们所要的单例模式了。
那我们就需要加锁了,使用 synchronized 关键字。
[/code]
这样我们的安全隐患就被解决了,但是同样带来了一个问题。那就是每次都要判断锁,程序的执行效率就会比较低。所以我们就应该尽量减少判断锁的次数,以提高运行效率。加上双重判断,也就是最开始的代码。
推荐使用饿汉模式,简单,安全。
http://blog.csdn.net/u012301841/article/details/50868456
单例模式在我们开发中经常会用到的,不知道你所喜欢用饿汉模式还是喜欢懒汉模式呢?为什么会出现有两种方式来实现单例模式?
我看这其中必蹊跷,你怎么看?
大家都知道的是:懒汉模式会通过 判 null,然后 new 出一个实例,也就是懒汉模式会延迟加载出实例对象。还有其他的区别吗?
我们来看一下懒汉模式和饿汉模式的实现代码。
/** * 饿汉模式 * @author zhou.ni * @versionCode 1 <每次修改提交前+1> */ public class HungrySingle { private static final HungrySingle sInstance = new HungrySingle(); private HungrySingle() { } public static HungrySingle getInstance() { return sInstance; } }
[/code]
在饿汉模式中,初始化变量的时候最好加上 final 关键字,这样比较严谨。
/** * 懒汉模式 * @author zhou.ni * @versionCode 1 <每次修改提交前+1> */ public class LazySingle { private static LazySingle sInstance = null; private LazySingle() { } public static LazySingle getInstance() { if (sInstance == null) { synchronized (LazySingle.class) { if (sInstance == null) { sInstance = new LazySingle(); } } } return sInstance; } }
[/code]
很多人奇怪,我的懒汉模式不是这样写的?为什么要这样写呢?
public static LazySingle getInstance() { if (sInstance == null) { sInstance = new LazySingle(); } return sInstance; }
[/code]
一般这样写的,在大多数情况下这样写是没问题的。但是如果在多线程并发执行的时候,就会很容易出现安全隐患。
第一个线程进来判断 sInstance == null,还没有new 出实例的时候 。这个时候第二个线程也进来了,判断的sInstance 也是 null,然后也会 new 出实例的,这样就不是我们所要的单例模式了。
那我们就需要加锁了,使用 synchronized 关键字。
public static LazySingle getInstance() { synchronized (LazySingle.class) { if (sInstance == null) { sInstance = new LazySingle(); } return sInstance; } }
[/code]
这样我们的安全隐患就被解决了,但是同样带来了一个问题。那就是每次都要判断锁,程序的执行效率就会比较低。所以我们就应该尽量减少判断锁的次数,以提高运行效率。加上双重判断,也就是最开始的代码。
推荐使用饿汉模式,简单,安全。
相关文章推荐
- 单例模式中的懒汉模式和恶汉模式的区别
- 单例模式之懒汉模式&恶汉模式
- 单例模式,懒汉模式,饿汉模式区别
- iOS开发单例模式(懒汉模式&恶汉模式)
- 【单例模式】——饿汉模式与懒汉模式及其区别
- java 单例模式 恶汉 懒汉 静态内部类 线程安全
- 单例模式(懒汉与恶汉)
- 单例模式举例:恶汉模式,懒汉模式及其他
- java设计模式之单列模式(懒汉,恶汉,double-check- lock)
- 黑马程序员,黑马论坛-------单例模式的两种实现(恶汉+懒汉)
- JAVA单例设计模式简单实现(懒汉与恶汉),多例设计模式的简单实现
- 需要使用单一实例合需要应用单例模式的区别
- 设计模式:Abstract Factory和Builder(比较区别,个人认为讲得很明白)
- Bob Lee 写的新的懒汉单例模式
- HTML-based模式和URL-based模式的区别
- Bob Lee 写的新的懒汉单例模式
- Singleton(单件)模式与类静态函数(实用类)的区别
- HTML-based模式和URL-based模式的区别
- 数据访问模式 orm和cmp区别
- 设计模式区别(一)