1.饿汉
静态变量直接初始化
非懒加载、线程安全(类加载的锁)、效率高、JVM按需加载
public class MyClass {
public static final MyClass instance = MyClass();
}
2.懒汉
synchronized修饰的静态方法中判空、初始化、返回
效率低(每次都获取释放锁)、线程安全(类元对象作为锁)、懒加载、一次判空
public class MyClass {
private static MyClass instance;
public synchronized static MyClass getInstance(){
if(instance == null){
instance = new MyClass();
}
return instance;
}
}
3.双重检验
volatile修饰的静态私有变量,静态方法中双重判空,首次判空后加锁,锁内再次判空,空则初始化
懒加载、线程安全(一般用类元对象作为锁)、效率高
public class MyClass {
private volatile static MyClass instance;
public static MyClass getInstance() {
if (instance == null) {
synchronized (MyClass.class) {
if (instance == null) {
instance = new MyClass();
}
}
}
return instance;
}
}
4.静态内部类
静态内部类中的饿汉
懒加载、效率高、线程安全(类加载的锁)
public class MyClass {
public static class InnerClass {
public static MyClass instance = new MyClass();
}
}
5.枚举
创建只有一个实例的枚举类,在这个枚举类定义方法实现功能 类加载时创建、非懒加载、线程安全(类加载的锁)、可避免反序列化和反射可能导致的破坏、代码简洁
public enum MyClass {
INSTANCE;
public void doYourWork() {
}
}