| Name | Date | Size | #Lines | LOC | ||
|---|---|---|---|---|---|---|
| .. | - | - | ||||
| AppScope/ | 06-May-2025 | - | 35 | 32 | ||
| entry/ | 06-May-2025 | - | 1,204 | 1,082 | ||
| hvigor/ | 06-May-2025 | - | 38 | 36 | ||
| screenshots/ | 06-May-2025 | - | ||||
| .gitignore | D | 06-May-2025 | 133 | 12 | 12 | |
| README.md | D | 06-May-2025 | 7.8 KiB | 112 | 77 | |
| build-profile.json5 | D | 06-May-2025 | 1.4 KiB | 58 | 57 | |
| code-linter.json5 | D | 06-May-2025 | 958 | 35 | 34 | |
| hvigorfile.ts | D | 06-May-2025 | 843 | 22 | 5 | |
| oh-package.json5 | D | 06-May-2025 | 834 | 26 | 24 | |
| ohosTest.md | D | 06-May-2025 | 1.6 KiB | 12 | 10 |
README.md
1# ArkTS Sendable对象相关 2 3### 介绍 4 5#### 异步锁 6 7为了解决多线程并发任务间的数据竞争问题,ArkTS引入了异步锁能力。异步锁可能会被类对象持有,因此为了更方便地在并发实例间获取同一个异步锁对象,[AsyncLock对象](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-utils.md#asynclock)支持跨线程引用传递。 8 9由于ArkTS语言支持异步操作,阻塞锁容易产生死锁问题,因此在ArkTS中仅支持异步锁(非阻塞式锁)。同时,异步锁还可以用于保证单线程内的异步任务时序一致性,防止异步任务时序不确定导致的同步问题。 10 11#### ASON解析与生成 12 13[ASON工具](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-utils.md#arktsutilsason)与JS提供的JSON工具类似,JSON用于进行JS对象的序列化(stringify)、反序列化(parse)。ASON则提供了[Sendable对象](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/arkts-sendable.md)的序列化、反序列化能力。可以通过ASON.stringify方法将对象转换成字符串,也可以通过ASON.parse方法将字符串转成Sendable对象,以便此对象在并发任务间进行高性能引用传递。 14 15#### 共享容器 16 17ArkTS共享容器([@arkts.collections (ArkTS容器集)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-collections.md))是一种在并发任务间共享传输的容器类,可以用于并发场景下的高性能数据传递。功能与Ecmascript262规范定义的容器类似,但仍然有部分差异,具体可见[共享容器与原生API方法的行为差异对比](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/arkts-collections-introduction.md#共享容器与原生api方法的行为差异对比)。 18 19ArkTS共享容器在多个并发任务间传递时,其默认行为是引用传递,支持多个并发任务可以操作同一个容器实例。另外,也支持拷贝传递,即每个并发任务持有一个ArkTS容器实例。 20 21ArkTS共享容器并不是线程安全的,内部使用了fail-fast(快速失败)机制,即当检测多个并发实例同时对容器进行结构性改变时,会触发异常。因此,在容器内修改属性的场景下,开发者需要使用ArkTS提供的[异步锁](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/arkts-async-lock-introduction.md)机制保证ArkTS容器的安全访问。 22 23ArkTS共享容器包含如下几种:[Array](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-collections.md#collectionsarray)、[Map](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-collections.md#collectionsmap)、[Set](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-collections.md#collectionsset)、[TypedArray](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-collections.md#collectionstypedarray)(Int8Array、Uint8Array、Int16Array、Uint16Array、Int32Array、Uint32Array、Uint8ClampedArray、Float32Array)、[ArrayBuffer](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-collections.md#collectionsarraybuffer)等,具体可见[@arkts.collections (ArkTS容器集)](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkts/js-apis-arkts-collections.md)。 24 25#### 共享模块 26 27共享模块是进程内只会加载一次的模块,使用"use shared"这一指令来标记一个模块是否为共享模块。 28 29非共享模块在同一线程内只加载一次,在不同线程间会加载多次,在不同的线程内都会产生新的模块对象。因此可以使用共享模块来实现进程单例。 30 31#### Sendable对象冻结 32 33Sendable对象支持冻结操作,冻结后的对象变成只读对象,不能增删改属性,因此在多个并发实例间访问均不需要加锁,可以通过调用[Object.freeze](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)接口冻结对象。 34 35该工程中展示的代码详细描述可查如下链接: 36 37- [异步锁](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/arkts-async-lock-introduction.md) 38- [ASON解析与生成](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/ason-parsing-generation.md) 39- [共享容器](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/arkts-collections-introduction.md) 40- [共享模块](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/arkts-sendable-module.md) 41- [Sendable对象冻结](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/arkts-utils/sendable-freeze.md) 42 43### 效果预览 44 45| 首页 | 执行及结果即时反馈 | 46| :----------------------------------------------------------: | :----------------------------------------------------------: | 47| <img src="./screenshots/SendableObjectRelated_1.png" style="zoom: 50%;" /> | <img src="./screenshots/SendableObjectRelated_2.png" style="zoom: 50%;" /> | 48 49### 使用说明 50 511. 在主界面,点击任意按钮进行跳转,点击Hello World执行程序 522. 执行结果会即时反馈在屏幕中央,并在控制台打印log。 53 54### 工程目录 55 56``` 57entry/src/ 58 ├── main 59 │ ├── ets 60 │ │ ├── entryability 61 │ │ ├── entrybackupability 62 │ │ ├── managers 63 │ │ ├── ArktsAsyncLockIntroduction.ets // 异步锁示例代码 64 │ │ ├── ArktsCollectionsIntroduction.ets // 共享容器示例代码 65 │ │ ├── ArktsSendableModule.ets // 共享模块示例代码 66 │ │ ├── AsonParsingGeneration.ets // ASON解析与生成示例代码 67 │ │ ├── helper.ts // Sendable对象冻结示例代码 68 │ │ ├── SendableFreeze.ets // Sendable对象冻结示例代码 69 │ │ ├── sharedModule.ets // 共享模块示例代码 70 │ │ ├── test.ets // 共享模块示例代码 71 │ │ ├── pages 72 │ │ ├── Index.ets // 首页 73 │ │ ├── util 74 │ │ ├── CommonButton.ets // 首页跳转UI 75 │ │ ├── resource.ets // 资源引用转换 76 │ │ ├── workers 77 │ │ ├── Worker.ets // Sendable对象冻结示例代码 78 │ ├── module.json5 79 │ └── resources 80 ├── ohosTest 81 │ ├── ets 82 │ │ ├── test 83 │ │ ├── Ability.test.ets // 自动化测试代码 84``` 85 86### 相关权限 87 88不涉及。 89 90### 依赖 91 92不涉及。 93 94### 约束与限制 95 961.本示例仅支持标准系统上运行, 支持设备:RK3568。 97 982.本示例为Stage模型,支持API14版本SDK,版本号:5.0.2.57,镜像版本号:OpenHarmony_5.0.2.58。 99 1003.本示例需要使用DevEco Studio 5.0.1 Release (Build Version: 5.0.5.306, built on December 6, 2024)及以上版本才可编译运行。 101 102### 下载 103 104如需单独下载本工程,执行如下命令: 105 106```` 107git init 108git config core.sparsecheckout true 109echo code/DocsSample/ArkTs/ArkTsConcurrent/ConcurrentThreadCommunication/InterThreadCommunicationObjects/SendableObject/SendableObjectRelated > .git/info/sparse-checkout 110git remote add origin https://gitee.com/openharmony/applications_app_samples.git 111git pull origin master 112````