单例模式理解
某些情况下,对象被多次创建,消耗了大量内存。我们可以利用单例模式,对象只创建一次,每次操作的对象都是同一个对象。
单例模式的创建
饿汉式
public class Singleton1 {
private static Student student = new Student();
public static Student getInstance(){
return student;
}
private Singleton1(){}
}
饿汉式通过static关键字将对象创建提前到类的加载过程,通过将构造方法私有化避免破坏创建对象的唯一性。通过公有方法 getInstance()返回创建的对象
枚举实现单例模式
public enum Singleton3 {
INSTANCE;
}
懒汉式
懒汉式相较与饿汉式区别在于,懒汉式在我们需要对象的时候才去创建对象。但是它也存在多线程情况下的不安全问题,所以我们需要对其进行加锁。
public class Singleton2 {
private static volatile Singleton2 instance = null;
private Singleton2(){}
public static Singleton2 getInstance(){
synchronized (Singleton2.class){
if(instance == null){
synchronized (Singleton2.class){
if (instance == null){
// 新建一个对象不是原子操作,它被分为三条指令
instance = new Singleton2();
}
}
}
return instance;
}
}
}
这里通过判断了两次instance是否为空的情况,为的是使效率更高。代码中的voliate关键字防止指令重排和刷新内存中singleton的值并提示使用该对象的线程重新取值。