单例设计模式在Android开发实际应用场景解析–activity的管理

本文详细介绍了单例设计模式在Android中的应用,包括懒汉模式、DCL单例、volatile关键字、静态内部类以及容器单例,重点阐述了如何在Activity管理中使用这些模式,确保线程安全和资源优化。

单例设计模式在Android开发实际应用场景解析–activity的管理

Android中实际场景

常用的场景都是一些特殊的类,比如,管理类,皮肤的管理,activity的管理。

1.1 介绍

客户端调用单例类。

思路:

  1. 构造函数私有化。
  2. 通过静态方法获取单例对象。客户端调用
  3. 多线程环境下确保对象只有一个。
  4. 反序列化不能重新构造新对象。
1.1.1 懒汉模式

声明一个静态对象,第一次调用就初始化。

public class Singleton {
   
   
    private static Singleton instance;
    private Singleton(){
   
   }
    public static synchronized Singleton getInstance(){
   
   
        if (instance == null){
   
   
            instance = new Singleton();
        }
        return instance;
    }
}

我们加上synchronized关键字,这样就可以做到线程的同步,在多线程环境下保证单例。懒汉式在第一次调用的时候才会实例化,节约资源,缺点是同步方法的调用造成资源开销。

1.1.2 DCL单例

需要时才实例化单例,保证线程安全,并且没有同步锁开销。

public class Singleton {
   
   
    private static Singleton instance;

    private Singleton() {
   
   
    }

    public static Singleton getInstance() {
   
   
        if (instance == null) {
   
   
            synchronized (Singleton.class){
   
   
                if (instance == null){
   
   
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

getInstance()方法中我们判空两次,第一次是避免每次调用都进行同步锁,第二次是在null的条件下创建实例对象。

分析:

假设A,B两个线程执行getInstance(),instance = new Singleton();这句代码会被翻译成多条汇编指令,

  1. 分配内存。
  2. 调用构造函数。
  3. 将引用指向内存空间。

在多线程的环境下,这三个步骤的执行顺序不一样会导致DCL失效,执行顺序有可能1,2,3,或者1,3,2。在3执行完,2没执行之前,切换到B线程,这时候线程A执行了3,instance已经非空,B线程获取instance已经非空,就会出错。

1.1.3 volatile关键字
  1. 防止重排序。
  2. 线程可见性–某一个线程改变了公用对象(变量),短时间内可能是不可见的,每一个线程都有自己的缓冲区,线程工作区,
public class Singleton {
   
   
    private volatile static Singleton instance;

    private Singleton() {
   
   
    }

    public static Singleton getInstance() {
   
   
        if (instance == null) {
   
   
            synchronized (Singleton.class){
   
   
                if (instance == null){
   
   
                    instance = new Singleton();
                }
            } 
        }
        return instance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值