单例模式在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) |
|
来自: cherishchen > 《我的图书馆》