- 概述
像线程池、缓存、注册表等,有一个对象就够了,使用单例模式能够很好的满足这方面的需求。 - 定义
单例模式确保一个类只有一个实例,并提供一个全局访问点。 - UML
- 实现
/**
* 饿汉式单例模式实现
* 如果不考虑性能能和资源上的限制可以考虑此模式
*/
public class Singleton1 {
/**
* JVM在加载这个类时,马上创建一个单例
*/
private static Singleton1 uniqueInstance = new Singleton1();
private Singleton1() {
System.out.println("Singleton1");
}
public static Singleton1 getInstance() {
return uniqueInstance;
}
}
/**
* 双重校验锁单例模式实现
*/
public class Singleton2 {
/**
* volatile关键字确保可见性,保证线程安全
*/
private volatile static Singleton2 uniqueInstance;
private Singleton2() {
System.out.println("Singleton2");
}
/**
* 首先检查实例,如果不存在则进入同步块
* 进入同步块后,再检查一次,如果是null才创建实例
*
* @return Singleton2
*/
public static Singleton2 getInstance() {
if (null == uniqueInstance) {
synchronized (Singleton2.class) {
if (null == uniqueInstance) {
uniqueInstance = new Singleton2();
}
}
}
return uniqueInstance;
}
}
/**
* 测试类-单例模式
*/
public class SingletonTest {
public static void main(String[] args) {
Singleton1.getInstance();
Singleton2.getInstance();
}
}
运行结果:
参考资料:
《Head First设计模式》