1JDK中单例模式的体现
首先看一下一段JDK 源码中的Runtime类的一段代码
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
private Runtime() {}
}
从这段代码中我们能看出来每个java应用程序在在什么情况下运行,都会有一个唯一的Runtime实例对象 通过调用静态方法getRuntime()来获得这个唯一的实例,而且Runtime的构造方法是私有的,该Runtime持有对自己的引用,这就是最简单的一种设计模式单例模式啦,相信大家在面试的过程中会经常被问到你最熟悉的设计模式是什么,它在什么地方有所体现,相信这可以使一个好的回答了。
2 单例模式
通过上面的实例可以看出单例类具备以下几个特点:
- 单例类只能有一个实例
- 单例类必须自行创建这个实例
- 单例类必须自行向整个系统提供这个实例
3饿汉式单例模式
在本文最开始的那段代码就是饿汉式单例模式的一个体现,在java语言中通常用到的都是饿汉式单例,下面给出饿汉式单例的通用代码:
public class Singleton {
private static Singleton singleton = new Singleton() ;
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
下面写个测试,通过getInstance()获得两个Signgleton对象,判断是否相等
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s2==s1);
从打印的结果为true我们看以看出s1与s2连个实例是同一个对象。 之所以被称作是饿汉式单例,从上面也可以看出,这个Singleton类被加载时,静态变量singleton就会被初始化,此时Singleton类的私有构造函数就会被调用在此时单例类的实例就被创建出来了,看来确实够饿的,在类加载时就把实例唯一的实例创建出来
4懒汉式单例模式
与饿汉式单例不同的是,懒汉式单例在第一次引用时将单例的实例创建出来,他们的相同之处就是类的够着函数都是私有的,下面看下懒汉式单例的代码实现:
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton ==null){
singleton = new Singleton();
}
return singleton;
}
}
同样测试,看以可出创建的实例也是同一个
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s2==s1);
5饿汉式单例和懒汉式单例的比较
从上述两端代码中也可以看出,饿汉式单例在类加载时就创建了单例的实例,从资源利用的角度来看,肯定会比懒汉式单例差些,但是反观从时间和反应速度上,却比懒汉式单例好些,饿汉式单例更符合java语言的设计观点,在处可以参照《java与模式》,书中阐述了两种单例模式的比较,以及懒汉式单例在多线程首次同时引用此类时访问限制问题。