DCL(Double-Checked Locking)单例模式即双重检查锁定,是一种线程安全的懒汉式单例模式。
具体实现方法:
1、在TtsNovelUtil类中,添加如下代码,这里设置了Application作为传入的参数,如果不需要,可以去掉
public class TtsNovelUtil implements SpeechEngine.SpeechListener{
private static volatile TtsNovelUtil instance;
private TtsNovelUtil(Application application) {
//在这里填写需要调用的方法等
}
public static TtsNovelUtil getInstance(Application application) {
if (instance == null) { //第一次检查,避免不必要的同步操作,提高性能
synchronized (TtsNovelUtil.class) {
if (instance == null) { //第二次检查,确保在多线程下,只有第一个线程可以创建实例
instance = new TtsNovelUtil(application);
}
}
}
return instance;
}
解释:(1) 私有构造方法:将构造函数声明为 private,防止外部通过 new 关键字创建实例。
(2) 静态变量 instance:使用static修饰符,确保 instance 是类级别的变量,所有类的实例共享同一个 instance;使用volatile 关键字,防止指令重排序,确保多线程环境下的可见性和正确性,在多线程环境下,volatile 保证每个线程都能读取到最新的 instance 值。
(3)公共静态方法 getInstance():使用双重检查锁定(Double-Checked Locking);使用synchronized关键字,确保同一时间只有一个线程能够进入同步块,从而保证线程安全。
2、在Activity或者是其他的需要初始化TtsNovelUtil类中,添加如下代码
private TtsNovelUtil ttsNovelUtil = TtsNovelUtil.getInstance(getApplication());