1.单例模式
1. 饿汉式(Eager Initialization)
核心原理:类加载时立即创建实例,通过静态变量直接初始化。
代码示例:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {} // 私有构造
public static Singleton getInstance() {
return INSTANCE;
}
}
特点:
✅ 线程安全:JVM 类加载机制保证唯一实例。
❌ 非延迟加载:实例在类加载时创建,若未被使用则浪费资源。
适用场景:实例小、启动时即需使用的场景(如配置管理器)
2. 懒汉式(Lazy Initialization)
(1) 基础版(线程不安全)
代码示例:
public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); // 多线程下可能重复创建 } return instance; } }
问题:多线程并发时可能创建多个实例
3. 双重检查锁(Double-Checked Locking, DCL)
volatile在DCL中的两个核心作用:禁止指令重排序和保证内存可见性
核心优化:减少同步次数,兼顾性能与线程安全。
代码示例:
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
关键点:
✅ 延迟加载:实例在首次调用时创建。
✅ 高效同步:仅首次创建时加锁。
⚠️ 需 volatile:防止指令重排序导致未初始化对象被使用(JDK 1.5+ 生效)
4. 静态内部类(Static Inner Class)
原理:利用 JVM 类加载机制,内部类首次调用时才加载并初始化实例。
代码示例:
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
点:
✅ 线程安全:类加载过程由 JVM 保证同步。
✅ 延迟加载:无额外同步开销。
局限:无法通过参数初始化实例
2.生产者-消费者模式
生产者-消费者模式是一种经典的并发设计模式,用于解决生产者和消费者线程之间的资源协作问题。其核心是通过共享缓冲区(BlockingQueue)解耦生产与消费逻辑,平衡两者的处理速度差异。以下是该模式的实现方式、关键要点及最佳实践
1.核心实现方式
1. 基础版:wait()/notifyAll()
通过 synchronized
块和 wait()/notifyAll()
手动控制线程协作
public class Buffer {
private Queue<Integer> queue = new LinkedList<>();
private int capacity = 10;
public synchronized void produce(int value) throws InterruptedException {
while (queue.size() == capacity) { // 缓冲区满时等待
wait();
}
queue.offer(value);
notifyAll(); // 唤醒所有等待线程
}
public synchronized int consume() throws InterruptedException {
while (queue.isEmpty()) { // 缓冲区空时等待
wait();
}
int value = queue.poll();
notifyAll(); // 唤醒生产者
return value;
}
}
2.核心组件与原理
生产者
负责生成数据(如网络请求结果、传感器数据)并存入缓冲区。
当缓冲区满时,生产者线程自动阻塞(避免资源浪费)。
消费者
从缓冲区取出数据并处理(如更新 UI、保存到数据库)。
当缓冲区空时,消费者线程自动阻塞(避免空转)。
缓冲区
作为数据中转站,通常用线程安全队列实现(如
BlockingQueue
)。特性:容量限制、线程安全的存取操作(
put()
/take()
)。
同步机制
确保生产者和消费者不会同时操作缓冲区导致数据竞争(如队列空/满时的阻塞唤醒)
3.Android 典型应用场景
异步任务管理
生产者:后台线程下载图片 → 消费者:主线程更新 UI。
示例:
HandlerThread
+Handler
实现任务队列(生产者投递任务,Looper
消费任务)。
数据流处理
生产者:摄像头采集帧 → 消费者:子线程进行图像识别。
高并发请求控制
限制同时处理的网络请求数量(如线程池任务队列。
跨进程通信
通过
IntentService
或WorkManager
实现后台任务生产与消费
3.工厂模式
1. 简单工厂模式(静态工厂)
核心:一个工厂类根据参数创建不同对象。
Android应用:
BitmapFactory
:通过decodeResource()
、decodeFile()
等方法,根据资源类型自动创建Bitmap
,隐藏JPEG/PNG等格式的解码细节。通知创建:统一工厂根据类型生成不同样式通知(如基础通知、大图通知)。
2. 工厂方法模式(子类决策)
核心:定义抽象工厂接口,由子类实现具体对象创建。
Android应用:
LayoutInflater
:系统通过
onCreateView()
抽象方法,让子类决定如何创建View。自定义场景:通过
setFactory2()
替换系统控件(如全局将TextView
替换为AppCompatTextView
),实现兼容性适配。
RecyclerView:
onCreateViewHolder()
由子类决定创建哪种ViewHolder
,解耦视图类型与适配器逻辑。
3. 抽象工厂模式(产品家族)
核心:创建一组相关对象(如整套UI组件)。
Android应用:
Resources
体系:根据设备配置(分辨率、语言)自动加载匹配的Drawable
、字符串等资源,不同ResourcesImpl
生产当前环境所需的资源家族。主题切换:为深色/浅色模式提供配套的按钮、文本框等UI组件。
4. 开源框架中的应用
Retrofit:
Converter.Factory
根据接口返回类型选择数据解析器(如GsonConverterFactory
)。Glide:
ModelLoaderFactory
根据数据类型(URL、File等)创建对应的资源加载器