单例:即只返回同一个构建对象的一种设计模式
1.最常见的单例:这是一种线程不安全的单例
//单例模式 线程不安全 可能产生不同的单例实例
class Signle1{
private static Signle1 mInstance;
private Signle1(){}
public static Signle1 getInstance(){
if(mInstance==null){
try {
Thread.sleep(getRandom());
} catch (InterruptedException e) {
e.printStackTrace();
}
mInstance = new Signle1();
}
return mInstance;
}
public static long getRandom(){
Random random = new Random();
int max = 1000;
int min =100;
return random.nextInt(max)%(max-min+1)+min;
}
}
78685c81fab57c4a2b89b0e1ce21321.png
2.饿汉式单例:
//饿汉式 单例模式 线程安全 适用场景 开销小 运行就需要创建时使用
class Single2{
public static Single2 sInstance =new Single2();
private Single2(){}
public static Single2 getInstance(){
try {
Thread.sleep(getRandom());
} catch (InterruptedException e) {
e.printStackTrace();
}
return sInstance;
}
public static long getRandom(){
Random random = new Random();
int max = 1000;
int min =100;
return random.nextInt(max)%(max-min+1)+min;
}
}
fd45cd716d311cf4ba67d612d5b352c.png
3.懒汉式单例: 可以在用到时再加载单例对象
//饿汉式 线程安全
class Single3{
//volatile 防止指令重排 使双重检查不失效
private volatile static Single3 mInstance;
private Single3(){}
//锁住的资源太大
// public synchronized static Single3 getInstance(){
// if(mInstance==null)
// mInstance = new Single3();
// return mInstance;
// }
//采用DCL 双重校验
public static Single3 getInstance(){
if(mInstance==null){
synchronized (Single3.class){
if(mInstance==null){
mInstance = new Single3();
}
}
}
return mInstance;
}
}
e95da3e4e59025a7bfa9f3a15d4bcbc.png
5f161ff85956776be8a41c5c750a2b5.png
4.静态内部类单例:优点延迟加载
class Single4{
private Single4(){}
static class SigleHandler{
public static Single4 INSTANCE= new Single4();
}
public static Single4 getInstance(){
return Single4.SigleHandler.INSTANCE;
}
}
205b2809df47ee7fecb1fe7d2d5acb7.png
5.枚举构建单例:枚举本身就是线程安全的
//枚举单例
class Single5{
private Single5(){}
public enum SingelDealer{
SINGEL_DEALER;
private Single5 single5;
private SingelDealer(){
single5 = new Single5();
}
public Single5 getSingle5(){
return single5;
}
}
public static Single5 getInstance(){
return SingelDealer.SINGEL_DEALER.getSingle5();
}
}
478f53d9c98be4dcb074cfed3caf078.png
6.容器单例:
//容器单例 安卓常用 getSystemService(NOTIFICATION_SERVICE)就是用这种模式
class Single6{
private static HashMap<String,Object> mServiceList = new HashMap<>();
public static void registerService(String key,Object service){
if(!mServiceList.containsKey(key)){
mServiceList.put(key,service);
}
}
public static Object getService(String key){
return mServiceList.get(key);
}
}
网友评论