1# Sendable对象冻结 2 3Sendable对象支持冻结操作,冻结后的对象变成只读对象,不能增删改属性,因此在多个并发实例间访问均不需要加锁,可以通过调用[Object.freeze](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)接口冻结对象。 4 5## 使用示例 6 71. 提供ts文件封装Object.freeze方法。 8 9 ```ts 10 // helper.ts 11 export function freezeObj(obj: any) { 12 Object.freeze(obj); 13 } 14 ``` 15 162. 通过调用freeze方法冻结对象,并将对象发送给子线程。 17 18 ```ts 19 // Index.ets 20 import { freezeObj } from './helper'; 21 import { worker } from '@kit.ArkTS'; 22 23 @Sendable 24 export class GlobalConfig { 25 // 一些配置属性与方法 26 init() { 27 // 初始化相关逻辑 28 freezeObj(this); // 初始化完成后冻结当前对象 29 } 30 } 31 32 @Entry 33 @Component 34 struct Index { 35 build() { 36 Column() { 37 Text("Sendable freezeObj Test") 38 .id('HelloWorld') 39 .fontSize(50) 40 .fontWeight(FontWeight.Bold) 41 .onClick(() => { 42 let gConifg = new GlobalConfig(); 43 gConifg.init(); 44 const workerInstance = new worker.ThreadWorker('entry/ets/workers/Worker.ets', { name: "Worker1" }); 45 workerInstance.postMessage(gConifg); 46 }) 47 } 48 .height('100%') 49 .width('100%') 50 } 51 } 52 ``` 53 543. 子线程不加锁直接操作对象。 55 56 ```ts 57 // Worker.ets 58 import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS'; 59 import { GlobalConfig } from '../pages/Index'; 60 61 const workerPort: ThreadWorkerGlobalScope = worker.workerPort; 62 workerPort.onmessage = (e: MessageEvents) => { 63 let gConfig: GlobalConfig = e.data; 64 // 使用gConfig对象 65 } 66 ``` 67