一:利用voliate和synchronize实现
- voliate下实现可见性,保证getInstance返回的是初始化完全的对象。
- 在同步之前进行null检查,以尽量避免进入相对高昂的同步块。
- 直接在class级别进行同步
public class Singleton {
private static volatile Singleton singleton = null;
private Singleton() {
}
public static Singleton getSingleton() {
if (singleton == null) { // 尽量避免重复进入同步块
synchronized (Singleton.class) { // 同步.class,意味着对同步类方法调用
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
- 利用内部类持有静态对象的方法实现
理论依据:对象初始化过程中隐含的初始化锁。
public class Singleton {
private Singleton(){}
public static Singleton getSingleton(){
return Holder.singleton;
}
private static class Holder {
private static Singleton singleton = new Singleton();
}
}