实现方式
public class SingleTonInstance {
private SingleTonInstance(){};
public static SingleTonInstance getInstance(){
return SingleTonHolder.sInstance;
}
private static class SingleTonHolder{
private static final SingleTonInstance sInstance = new SingleTonInstance();
}
...
}
懒加载
程序运行时外部类会被加载到内存,而静态内部类不会加载,只有当getInstance方法被调用时才加载SingleTonHolder并生成外部类SingleTonInstance的实例对象sInstance 。
单例
由于sInstance是静态的,程序中仅有一个实例,保证了单例。
线程安全
加载SingleTonHolder类时,是调用ClassLoader的loadClass方法,最终加载类的方法中其实是采用synchronize加锁的,因为sInstance是该类成员变量也是在类加载方法中初始化的,所以保证了线程安全。
protected Class<?> loadClassOrNull(String cn, boolean resolve) {
synchronized (getClassLoadingLock(cn)) {
// check if already loaded
Class<?> c = findLoadedClass(cn);
return c;
}