1、什么是单例模式:
形象地说就是世界上的每个人都是唯一的个体,不能存在两个我,对应Java的世界,就是类只能有一个对象实例,也就是只能new出一个对象。
Java中存在两种单例模式的写法,懒汉模式和饿汉模式,懒汉模式比较好理解,就是加锁,饿汉模式其实需要了解Java的类加载机制才能够理解得更加充分。
首先是懒汉模式,实现如下:
public class Singleton {
private static Singleton singleObj = null;
// 1、单例模式下将构造函数私有化,从而让类的外部无法访问,就是类的外部无法new对象
private Singleton() {
}
// 2、提供对外公有的访问接口
public static Singleton getInstance() {
// 如果实例已经存在,直接返回
if(singleObj != null) {
return singleObj;
}
// 否则创建实例,并返回,此时必须考虑多线并发问题
synchronized (Singleton.class) {
singleObj = new Singleton();
}
return singleObj;
}
}
饿汉模式,因为静态对象是在类加载时就创建的,所以不存在线程问题:
class Singleton2{
// 直接创建当前类的静态对象实例,类加载时就会完成实例化
private static Singleton2 singleton = new Singleton2();
// 构造函数同样需要私有化,使得外部无法访问,不能new出对象
private Singleton2() {
}
// 提供对外的访问接口,获得实例
public static Singleton2 getInstance() {
return singleton;
}
}
注意饿汉模式效率更高,因为饿汉模式在类加载的时候对象就已经被创建,同时懒汉模式涉及到程序加锁,锁也是一个耗时的功能。