分享

单例模式的两种方式的对比

 cherishchen 2006-10-09
单例模式在java中有两种实现方式,分别为饿汉式和懒汉式,借鉴了网上的说法,总结下:
 
饿汉式:
public class EagerSingleton
{
private static final EagerSingleton m_instance =
new EagerSingleton();
/**
* 私有的默认构造子
*/
private EagerSingleton() { }
/**
* 静态工厂方法
*/
public static EagerSingleton getInstance()
{
return m_instance;
}
 
懒汉式:
 
package com.javapatterns.singleton.demos;
public class LazySingleton
{
private static LazySingleton
m_instance = null;
/**
* 私有的默认构造子,保证外界无法直接实例化
*/
private LazySingleton() { }
/**
* 静态工厂方法,返还此类的惟一实例
*/
synchronized public static LazySingleton
getInstance()
{
if (m_instance == null)
{
m_instance = new LazySingleton();
}
return m_instance;
}
}
 
参照了网上的一些好文章,总结如下:
 (1)饿汉式使用static实例变量,在类装入的时候就将自己实例化(在构造函数中可能需要实例化相关的资源),导致了类转载消耗的时间和资源都要比懒汉式的多,并且类的初始化操作是在每次类被载入的时候必须要做一次的(参见类初始化的文章),因此每当一个客户端调用EagerSingleton.getInstance()方法,就会导致一次(而且只有一次)新的EagerSingleton的初始化操作。相对此,对于懒汉式来说,类初始化只是一个变量,并没有实例化的操作,速度就快多了。
(2)懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。而饿汉式则因为是类转载的时候完成了初始化的操作,待续。。。。

(2)
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多