一、概念
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局静态的访问方法。
二、典型代码
2.1. 饿汉模式
当类被加载时,单例对象立即被创建。
package patterns.singleton;
/**
* 饿汉模式
* @author Tomcat
*
*/
public class EagerSingleton {
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
Note:不管用不用,都会在内存中被创建。
2.2. 懒汉模式
当类被加载时,不立即创建单例对象,而是延迟到使用对象时才创建。
/**
* 懒汉模式
* @author Tomcat
*
*/
public class LazySingleton {
private volatile static LazySingleton instance;
private LazySingleton () {}
public static LazySingleton getInstance() {
if(instance == null) { //第一重判断
synchronized(LazySingleton.class) { //线程安全
if(instance == null) { //第二重判断
instance = new LazySingleton();
}
}
}
return instance;
}
Note:volatile确保被修饰的成员变量能够被多线程正确地处理,但会因屏蔽JVM对代码所做的一些优化而导致降低系统运行效率。
2.3. 更好的模式
package patterns.singleton;
public class BetterSingleton {
private BetterSingleton() {}
//创建单例对象的静态内部类
private static class Creator {
private final static BetterSingleton instance = new BetterSingleton();
}
public static BetterSingleton getInstance() {
return Creator.instance;
}
}
Note:使用私有的静态内部类来创建静态的单例对象,既实现了按需延迟创建,又保证了线程安全和代码执行性能,是一种比较完美的实现模式。