单例模式的定义
单例模式确保一个类只有一个实例,并提供一个全局唯一访问点
单例模式的类图
单例模式的实现
饿汉式
- static 变量在类装载的时候进行初始化
- 多个实例的 static 变量会共享同一块内存区域
初始化类的时候就创建
public class Singleton {
//构造私有化,防止直接new
private Singleton(){}
//静态初始化器(static initializer)中创建实例,保证线程安全
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
饿汉式是线程安全的,JVM在加载类时马上创建唯一的实例对象,且只会装载一次。
懒汉式
单例模式的懒汉式实现方式体现了延迟加载的思想(延迟加载也称懒加载Lazy Load,就是一开始不要加载资源或数据,等到要使用的时候才加载)
同步方法
public class Singleton {
private static Singleton singleton;
private Singleton(){}
//解决了线程不安全问题,但是效率太低了,每个线程想获得类的实例的时候,都需要同步方法
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
双重检查加锁
public class Singleton {
//volatitle关键词确保,多线程正确处理singleton
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton ==null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
静态内部类
public class Singleton {
private Singleton(){}
private static class SingletonInstance{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}