单例模式结构图
饿汉式单例类
public class Singleton {
//static final修饰的变量是唯一不可变的,线程安全
private static final Singleton INSTANCE_SINGLETON = new Singleton();
//构造器私有
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE_SINGLETON;
}
}
懒汉式单例类
public class Singleton2 {
private static Singleton2 instance = null;
//构造器私有
private Singleton2() {}
//此时并非线程安全的,当多线程访问时,有可能创建多个实例
public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
多线程时的单例
public class Singleton2{
private static Singleton2 instance = null;
//构造器私有
private Singleton2() {}
//此时并非线程安全的,当多线程访问时,有可能创建多个实例
//优化:加锁,静态方法,这是一个类锁
public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
双重锁定
public class Singleton2{
private static Singleton2 instance = null;
//构造器私有
private Singleton2() {}
//此时并非线程安全的,当多线程访问时,有可能创建多个实例
//再次优化
public static Singleton2 getInstance() {
if(instance == null) {//此时只有在实例未被创建的时候再做加锁处理,否则直接返回
synchronized (Singleton2.class) {
if (instance == null) {//多线程访问的时候,保证有且只有一个实例
instance = new Singleton2();
}
}
}
return instance;
}
}
饿汉懒汉比较
饿汉式:即静态初始化的方式,它是类一加载就实例化对象,所以要提前占用系统资源,但不必考虑线程安全问题。
懒汉式:面临着多线程访问的安全性问题,需要做双重锁定这样的处理才可以保证安全。