饿汉模式 优点:线程安全,虚拟机保证只会转载一次,在装载类的时候是不会出现并发的 缺点:启动的时候就创建,浪费资源
public class Singleton {
private static Singleton mInstance = new Singleton();
public static Singleton getInstance() {
return mInstance;
}
}
懒汉模式1 优点:懒加载启动,使用的时候才创建,占用资源小 缺点:线程不安全,比如有AB两个线程同时访问getInstance就可能导致并发问题
public class Singleton {
private static Singleton mInstance = null;
public static Singleton getInstance() {
if (mInstance == null) {
mInstance = new Singleton();
}
return mInstance;
}
}
懒汉模式2 优点:懒加载启动,占用资源小,线程安全 缺点:降低访问速度,并发性能差
public class Singleton {
private static Singleton mInstance = null;
public static synchronized Singleton getInstance(){
if (mInstance == null){
mInstance = new Singleton();
}
return mInstance;
}
}
懒汉模式3 优点:懒加载启动,使用的时候才创建,占用资源小,线程安全 必须使用volatile关键字来修饰 被volatile修饰的变量不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而保证多个线程能正确的处理该变量
public class Singleton {
private static volatile Singleton mInstance = null;
public static Singleton getInstance(){
if (mInstance == null){
synchronized (Singleton.class){
if (mInstance == null){
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
静态内部类模式 优点:外部类加载的时候,并不会加载该静态内部类,只有在主动调用的时候才会被加载,节省了内存开销 该模式不仅能确保线程安全,同时也延迟了单例的实例化 缺点:外部无法传递参数到静态内部类中
private static class SingletonHolder{
private static Singleton mInstance = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.mInstance;
}