Sendable对象冻结
Sendable对象支持冻结操作。冻结后,对象变为只读,不能修改属性。因此,多个并发实例间访问时无需加锁。可以通过调用Object.freeze接口冻结对象。
不支持在.ets文件中使用Object.freeze接口。
使用示例
-
提供ts文件封装Object.freeze方法。
// helper.tsexport function freezeObj(obj: any) {Object.freeze(obj);} -
调用freeze方法冻结对象,然后将其发送到子线程。
// SendableFreeze.etsimport { freezeObj } from './helper';import { worker } from '@kit.ArkTS';@Sendableexport class GlobalConfig {// 一些配置属性与方法init() {// 初始化相关逻辑freezeObj(this); // 初始化完成后冻结当前对象}}@Entry@Componentstruct Index {build() {Column() {Text("Sendable freezeObj Test").id('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {let gConfig = new GlobalConfig();gConfig.init();const workerInstance = new worker.ThreadWorker('entry/ets/workers/Worker.ets', { name: "Worker1" });workerInstance.postMessage(gConfig);})}.height('100%').width('100%')}} -
子线程直接操作对象,不加锁。
// Worker.etsimport { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';import { GlobalConfig } from '../pages/Index';const workerPort: ThreadWorkerGlobalScope = worker.workerPort;workerPort.onmessage = (e: MessageEvents) => {let gConfig: GlobalConfig = e.data;// 使用gConfig对象}