1.懒加载
所谓懒加载,就是知道第一次被调用时才加载。
public class Singleton {
//volatile关键字的作用
//1.保证变量对于所有线程的可见性
//2.禁止指令重排优化
private volatile static Singleton instance;
private Singleton() {
}
//双重检查锁
//防止synchronized同步过程中其他线程进行了实例化
public static Singleton getInstance() {
//第一次检查是否实例化
if (instance == null) {
//同步代码块
synchronized (Singleton.class) {
//二次检查是否实例化
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
2.预加载
预加载是在类加载时就已经初始化好了,所以是线程安全的,不需要像懒加载那样考虑并发的问题。
public class Singleton(){
//此处的final防止后面有人修改
private static final Singleton instance = new Singleton();
private Singleton(){}
private static Singleton getInstance(){
return instance ;
}
}
3.静态内部类
预加载方式的升级版,在保证线程安全的同时还实现了延迟加载。
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton(){}
//只有在调用getInstance()方法的时候才会创建对象
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
4.枚举
《Effective Java中文版》第二版中的推荐实现方式。
public enum Singleton {
/**
* 单例实例
*/
INSTANCE;
public void doSomeThing(){
System.out.println("done");
}
}
使用方法:Singleton.INSTANCE.doSomeThing();
枚举的两个特性:
- 枚举的构造器总是私有的
- 枚举类中的每个值,都是实例(只有INSTANCE这一个实例)