单例模式的三种实现

三种模式分别是 懒汉式,
//饿汉式、
//IoDh

最好的是第三种,

/*
 * 饿汉式
 */
public class Single {

    // 懒汉式
    private static Single single = null;

    private Single() {

    }

    public static Single newInstance() {
        if (single == null) {
            synchronized (Single.class) {
                if (single == null) {
                    single = new Single();
                }
            }
        }
        return single;
    }

}

// 饿汉式
class Single2 {

    private static Single2 s = new Single2();

    private Single2() {

    }

    public static Single2 newInstance() {
        return s;
    }

}

// IoDh

class Single3 {

    private Single3() {

    }

    private static class IoDh {
        private static Single3 s = new Single3();
    }

    public static Single3 newInstance() {
        return IoDh.s;
    }

}
  饿汉式单例类在类被加载时就将自己实例化,它的优点在于无须考虑多线程访问问题,可以确保实例的唯一性;从调用速度和反应时间角度来讲,由于单例对象一开始就得以创建,因此要优于懒汉式单例。但是无论系统在运行时是否需要使用该单例对象,由于在类加载时该对象就需要创建,因此从资源利用效率角度来讲,饿汉式单例不及懒汉式单例,而且在系统加载时由于需要创建饿汉式单例对象,加载时间可能会比较长。

  懒汉式单例类在第一次使用时创建,无须一直占用系统资源,实现了延迟加载,但是必须处理好多个线程同时访问的问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过双重检查锁定等机制进行控制,这将导致系统性能受到一定影响。

通过使用IoDH,我们既可以实现延迟加载,又可以保证线程安全(由Java虚拟机来保证其线程安全性,确保该成员变量只能初始化一次。(这里我也没有弄懂。谁懂了留个言。)),不影响系统性能,不失为一种最好的Java语言单例模式实现方式(其缺点是与编程语言本身的特性相关,很多面向对象语言不支持IoDH)。

你可能感兴趣的:(技术文档,单例模式)