HarmonyOS 应用并发同步的样例代码

当前做网络请求基础部分,正常的网络请求要进行加解密,加解密需要从服务器端动态获取密钥,而密钥存在一定的有效期,多个网络请求同时并发,密钥失效时需要请求服务器进行更新,要做同步处理避免重复请求引起混乱。

HarmonyOS
2024-08-28 14:04:48
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

ArkTS语言基础类库提供的taskPool和worker两个多线程的方案,都是基于Actor并发模型实现的。Actor并发模型是基于事件基础传递数据,不需要开发者去面对锁代来的一系列复杂偶发的问题,是线程安全的,同时并发度也相对较高。目前线程间的数据传输支持的对象分为三类,普通的JavaScript对象,可转移对象,可共享对象。

在ArkTS中,可以通过可共享对象和Atomics实现锁机制,将请求密钥的逻辑放在同步代码块中,保证只有一个请求在请求密钥。

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/serialization-support-types-V5#%E5%8F%AF%E5%85%B1%E4%BA%AB%E5%AF%B9%E8%B1%A1

参考代码:

@Concurrent 
function transferAtomics(arg1: Int32Array) { 
  console.info("=== wait begin::"); 
  // 使用Atomics进行操作 
  while (true) { 
    // 请求秘钥 
    const oldValue = Atomics.compareExchange(arg1, 0, 0, 1); 
    if (oldValue === 0) { 
      break; 
    } 
    Atomics.wait(arg1, 0, 1, 3000) 
  } 
  let res = true; 
  console.info("=== wait end::"); 
  return res; 
} 
 
 
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
 
  build() { 
    Row() { 
      Column() { 
        Button(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let sab: SharedArrayBuffer = new SharedArrayBuffer(20); 
            let int32 = new Int32Array(sab); 
            let task: taskpool.Task = new taskpool.Task(transferAtomics, int32); 
            let task2: taskpool.Task = new taskpool.Task(transferAtomics, int32); 
            taskpool.execute(task).then((res) => { 
              console.info("=== this res is: " + res); 
            }); 
            taskpool.execute(task2).then((res) => { 
              console.info("=== this res2 is: " + res); 
            }); 
            setTimeout(() => { 
              Atomics.compareExchange(int32, 0, 1, 0); 
            }, 20000); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
分享
微博
QQ
微信
回复
2024-08-28 22:33:01
相关问题
HarmonyOS 能否提供Web工程代码
105浏览 • 1回复 待解决
eTS求助 tabBarIcon代码
5748浏览 • 1回复 待解决
HarmonyOS H5拉起系统相机代码
140浏览 • 1回复 待解决
HarmonyOS能否提供数据存储工程
238浏览 • 1回复 待解决
HarmonyOS 运行工程,报App Launch
391浏览 • 1回复 待解决
HarmonyOS 能否提供登录界面demo?
147浏览 • 1回复 待解决
HarmonyOS 请提供登录页面的实现
281浏览 • 1回复 待解决
HarmonyOS有没有通用工具类Demo
301浏览 • 1回复 待解决
是否有样代码
833浏览 • 1回复 待解决
DevEco Studio 2.2.0.200 x64加载保错
5660浏览 • 1回复 待解决
希望能提供一下图片处理工程
283浏览 • 1回复 待解决
如何实现鸿蒙应用离线数据同步?
63浏览 • 0回复 待解决