1、概念
简单明了的的理解就是,确保在一个类的对象是唯一的,在一定的生命进程中,只有一个该类的对象在工作。
2、懒汉式、饿汉式
public static class Singleton {
private static Singleton sInstance;
private Singleton() {
}
public static Singleton getInstance() {
sInstance = new Singleton();
return sInstance;
}
}
懒汉式和饿汉式的区别就是在于,是在调用的时候初始化还是直接初始化上面。
3、双重检测 (使用volatile之后,线程安全)
public static class Singleton {
private static volatile Singleton sInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (sInstance == null) {
synchronized (Singleton.class) {
if (sInstance == null) {
sInstance = new Singleton();
}
}
}
return sInstance;
}
}
这里用到了一个关键字volatile
,该关键字的作用是防止指令重排。说白了就是确保多线程情况下访问地址一致。使用volatile
关键字之后,对于修改的内容,线程之间看到的数据都会是最新的,保持了及时的更新,确保了可见性。
4、内部类方式实现 (线程安全)
public static class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
4、枚举类型实现 (线程安全)
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}