HarmonyOS 鸿蒙Next 多线程模式下如何创建一个单例?
HarmonyOS 鸿蒙Next 多线程模式下如何创建一个单例?
我们可以先看下如下的代码:
export class Singleton {
private static instance: Singleton = new Singleton();
private constructor() {
}
public static getInstance(): Singleton {
return Singleton.instance;
}
}
// index.ets
taskpool.execute(func, Singleton.getInstance());
@Concurrent
function func(instance: Singleton) {
console.log(‘是否相等:’ + (Singleton.getInstance() === instance));
}
大家可以思考下上述代码执行之后,log的结果。
答案其实是:false,也就是主线程和子线程通过getInstance拿到的单例对象其实不是一个。
这是为什么呢?这是因为taskpool的底层实现是基于worker,而worker的运行机制是每个worker都有一个独立的运行空间,每个线程的worker内存不是共享的,因此上述代码得到的就不是同一个实例对象。
那么我们怎么才能创建一个在不同线程拿到的是同一个对象的单例呢?
答案是我们可以使用框架给我们提供的 ‘use shared’ 这一指令来标记一个模块为共享模块,共享模块就是进程内只会加载一次的模块。
代码如下:
‘use shared’
@Sendable
export class Singleton {
private static instance: Singleton = new Singleton();
private constructor() {
}
public static getInstance(): Singleton {
return Singleton.instance;
}
}
// index.ets
taskpool.execute(func, Singleton.getInstance());
@Concurrent
function func(instance: Singleton) {
console.log(‘是否相等:’ + (Singleton.getInstance() === instance));
}
此时,我们得到的就是同一个单例对象,即log的结果为true。
更多关于HarmonyOS 鸿蒙Next 多线程模式下如何创建一个单例?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next 多线程模式下如何创建一个单例?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next多线程模式下创建单例,需要确保单例对象的唯一性和线程安全性。这通常通过双重检查锁定(Double-Checked Locking)和静态内部类(Bill Pugh Singleton)等方式实现。以下是使用双重检查锁定创建单例的示例代码:
public class Singleton {
// volatile确保多线程下的可见性和有序性
private static volatile Singleton instance = null;
// 私有构造函数防止外部实例化
private Singleton() {}
// 双重检查锁定实现线程安全的单例
public static Singleton getInstance() {
if (instance == null) { // 第一次检查,无需同步
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查,确保只有一个线程实例化
instance = new Singleton();
}
}
}
return instance;
}
}
上述代码通过volatile
关键字和双重检查锁定机制,确保在多线程环境下单例对象的唯一性和线程安全性。
此外,也可以使用静态内部类的方式实现单例,这种方式利用了类加载机制来保证线程安全和唯一性,代码更加简洁:
public class Singleton {
private Singleton() {}
private static class SingletonHelper {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHelper.INSTANCE;
}
}
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html