Sendable对象冻结

Sendable对象支持冻结操作。冻结后,对象变为只读,不能修改属性。因此,多个并发实例间访问时无需加锁。可以通过调用Object.freeze接口冻结对象。

说明:

不支持在.ets文件中使用Object.freeze接口。

使用示例

  1. 提供ts文件封装Object.freeze方法。

    // helper.ts
    export function freezeObj(obj: any) {
      Object.freeze(obj);
    }
    
  2. 调用freeze方法冻结对象,然后将其发送到子线程。

    // SendableFreeze.ets
    import { freezeObj } from './helper';
    import { worker } from '@kit.ArkTS';
     
    @Sendable
    export class GlobalConfig {
      // 一些配置属性与方法
      init() {
        // 初始化相关逻辑
        freezeObj(this); // 初始化完成后冻结当前对象
      }
    }
     
    @Entry
    @Component
    struct 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%')
      }
    }
    
  3. 子线程直接操作对象,不加锁。

    // Worker.ets
    import { 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对象
    }