单例模式核心作用
- 保证一个类只有一个实例、并且提供一个访问该实例的全局访问点。
常见的应用场景
- Windows 的 Task Manager(任务管理器)
- Windows 的 Recycle Bin(回收站)
- Servlet中 Application 作用域
- Spring框架中、每个Bean是单例的
- 网站的计数器
单例模式的优点
- 由于单例模式之生成一个实例、减少了系统性能开销、当一个对象需要比较多的资源时、则可以在应用启动时只产生一个单例对象、然后永驻内存的方式来解决。
- 单例模式可以在系统设置全局的访问点、优化共享资源访问。
单例模式实现的多种方法
- 饿汉式单例模式【优点:线程安全、调用效率高。 缺点:不能延时加载】
public class SingletonDemo1 {
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {
}
public static SingletonDemo1 getInstance() {
return instance;
}
}
- 懒汉式单例模式【优点:可以延迟加载 缺点:默认非线程安全、效率较低】
public class SingletonDemo2 {
private static SingletonDemo2 instance = null;
private SingletonDemo2() {
}
public static synchronized SingletonDemo2 getInstance() {
if (null == instance) {
instance = new SingletonDemo2();
}
return instance;
}
}
public class SingletonDemo3 {
private static SingletonDemo3 instance = null;
private SingletonDemo3() {
}
public static SingletonDemo3 getInstance() {
if (null == instance) {
SingletonDemo3 sd;
synchronized (SingletonDemo3.class) {
sd = instance;
if (sd == null) {
synchronized (SingletonDemo3.class) {
sd = new SingletonDemo3();
}
instance = sd;
}
}
}
return instance;
}
}
- 测试静态内部类实现单例模式【优点:线程安全、调用效率高、并实现了延迟加载】
public class SingletonDemo4 {
private static class SingletonClassInstance {
private static final SingletonDemo4 instance = new SingletonDemo4();
}
private SingletonDemo4() {
}
public static SingletonDemo4 getInstance() {
return SingletonClassInstance.instance;
}
}
- 枚举实现单例【优点:线程安全、调用效率高 缺点:不能延迟加载】
public enum SingletonDemo5 {
INSTANCE;
}