是什么——什么是单例模式
单例模式(Singleton Pattern),是一种创建型设计模式,它规定了一个类有且只有一个实例存在。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
为什么——为什么要用单例模式
节约系统资源,避免频繁创建对象。
怎么做——怎么实现单例模式
- 1.懒汉式单例模式
懒加载,需加同步保证线程安全。同步方法导致不高效。
/**
* 懒汉式单例模式
*/
public class LazySingleton {
private static LazySingleton INSTANCE;
private LazySingleton(){
}
public static synchronized LazySingleton getInstance(){
if(INSTANCE == null){
INSTANCE = new LazySingleton();
}
return INSTANCE;
}
}
- 2.饿汉式单例模式
线程安全,非懒加载,某些情况下不适用。
/**
* 饿汉式单例模式
*/
public class EagerSingleton {
private static EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton(){
}
public static EagerSingleton getInstance(){
return INSTANCE;
}
}
- 3.双重加锁检查单例模式
懒加载,线程安全,JDK1.5之前存在问题,不建议使用。
/**
* 双重加锁检查单例模式
*/
public class DoubleCheckedLockSingleton {
private static volatile DoubleCheckedLockSingleton INSTANCE;
private DoubleCheckedLockSingleton(){
}
public static DoubleCheckedLockSingleton getInstance(){
if(INSTANCE == null){
synchronized (DoubleCheckedLockSingleton.class){
if(INSTANCE == null){
INSTANCE = new DoubleCheckedLockSingleton();
}
}
}
return INSTANCE;
}
}
4.静态内部类单例模式
懒加载,线程安全。Effective Java推荐的方法。
/**
* 静态内部类单例模式
*/
public class StaticNestedClassSingleton {
private static class SingletonHolder{
private static final StaticNestedClassSingleton INSTANCE
= new StaticNestedClassSingleton();
}
private StaticNestedClassSingleton(){
}
public static StaticNestedClassSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
5.枚举单例模式
简单,线程安全,非懒加载,能避免反序列化生成新的对象。
/**
* 枚举单例模式
*/
public enum EnumSingleton {
INSTANCE;
}