文章目录
单例设计模式在Android开发实际应用场景解析–activity的管理
Android中实际场景
常用的场景都是一些特殊的类,比如,管理类,皮肤的管理,activity的管理。
1.1 介绍
客户端调用单例类。
思路:
- 构造函数私有化。
- 通过静态方法获取单例对象。客户端调用
- 多线程环境下确保对象只有一个。
- 反序列化不能重新构造新对象。
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();这句代码会被翻译成多条汇编指令,
- 分配内存。
- 调用构造函数。
- 将引用指向内存空间。
在多线程的环境下,这三个步骤的执行顺序不一样会导致DCL失效,执行顺序有可能1,2,3,或者1,3,2。在3执行完,2没执行之前,切换到B线程,这时候线程A执行了3,instance已经非空,B线程获取instance已经非空,就会出错。
1.1.3 volatile关键字
- 防止重排序。
- 线程可见性–某一个线程改变了公用对象(变量),短时间内可能是不可见的,每一个线程都有自己的缓冲区,线程工作区,
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;
}
}

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

被折叠的 条评论
为什么被折叠?



