Android单例模式-饿汉模式-DCL模式-内部静态类-双重检查锁定模式-懒汉模式
懒汉模式
public class SluggardSingleton {
private static SluggardSingleton mInstance= new SluggardSingleton();
private SluggardSingleton(){
Log.d(MainActivity.TAG, "SluggardSingleton: 初始化,构造函数用private修饰,避免了类在外部被实例化");
}
public static SluggardSingleton getInstance(){
Log.d(MainActivity.TAG, "SluggardSingleton: 返回mInstance");
return mInstance;
}
}
饿汉模式
public class StarvingSingleton {
private static StarvingSingleton mInstance;
private StarvingSingleton (){
Log.d(MainActivity.TAG, "StarvingSingleton: 初始化,构造函数用private修饰,避免了类在外部被实例化");
}
public static synchronized StarvingSingleton getInstance(){
if(null == mInstance){
Log.d(MainActivity.TAG, "StarvingSingleton: 检查 check mInstance为空,进行初始化");
mInstance = new StarvingSingleton();
}else {
Log.d(MainActivity.TAG, "StarvingSingleton: mInstance已存在,直接返回");
}
return mInstance;
}
}
DCL模式
public class DCLSingleton {
private static DCLSingleton mInstance;
private DCLSingleton(){
Log.d(MainActivity.TAG, "DCLSingleton: 初始化,构造函数用private修饰,避免了类在外部被实例化");
}
public static DCLSingleton getInstance(){
if(null == mInstance){
Log.d(MainActivity.TAG, "DCLSingleton: 最外部 check mInstance 为空,对类进行加锁");
synchronized (DCLSingleton.class){
if(null == mInstance){
Log.d(MainActivity.TAG, "DCLSingleton: 再次检查 check mInstance 为空,初始化");
mInstance = new DCLSingleton();
}
}
}else {
Log.d(MainActivity.TAG, "DCLSingleton: mInstance已存在,直接返回");
}
return mInstance;
}
}
DCL + Volatile
public class DCLVolatileSingleton {
private static volatile DCLVolatileSingleton mInstance;
private DCLVolatileSingleton(){
Log.d(MainActivity.TAG, "DCLVolatileSingleton: 初始化,构造函数用private修饰,避免了类在外部被实例化");
}
public static DCLVolatileSingleton getInstance(){
if(null == mInstance){
Log.d(MainActivity.TAG, "DCLVolatileSingleton: 最外部 check mInstance 为空,对类进行加锁");
synchronized (DCLVolatileSingleton.class){
if(null == mInstance){
Log.d(MainActivity.TAG, "DCLVolatileSingleton: 再次检查 check mInstance 为空,初始化");
mInstance = new DCLVolatileSingleton();
}
}
}else {
Log.d(MainActivity.TAG, "DCLVolatileSingleton: mInstance已存在,直接返回");
}
return mInstance;
}
}
内部静态类
public class InternalClassSingleton {
private InternalClassSingleton (){
Log.d(MainActivity.TAG, "InternalClassSingleton: 初始化,构造函数用private修饰,避免了类在外部被实例化");
}
public static InternalClassSingleton getInstance(){
return InternalClassSingletonHolder.instance;
}
private static class InternalClassSingletonHolder {
private static final InternalClassSingleton instance = new InternalClassSingleton();
}
}