简单的懒汉饿汉就不谈了~
方式一:使用synchronized的双重检查
package com.example.demo;
public class Singleton {
//volatile关键字必须,否则指令重排时会出问题
private static volatile Singleton instance;
private Singleton(){
System.out.println(instance);
}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
方式二:内部类中new出Singleton的静态对象
既不用加锁,也可以实现懒加载
package com.example.demo;
public class Singleton {
private Singleton(){
System.out.println("instance");
}
private static class Inner{
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return Inner.instance;
}
}