HarmonyOS 鸿蒙Next 单例模式的工具类,出现了两个实例

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 单例模式的工具类,出现了两个实例

AppConfig是一个单例类。 调用其中的getLoadingShowing()方法时,实例为5c2f347e

调用其中的setLoadingShowing()方法是,实例为52ea577。

调用位置是在eventHub.on调用 请问这是怎么回事?怎么单例的类会出现两个实例。

2 回复
如果单例如果没有做线程安全,那么在不同线程里面使用,就会出现不同的示例对象。你两次的位子,一个是主线程,一个是子线程。

下面是给你提供一个线程安全的单例demo,可以参考一下:

import { ArkTSUtils } from '@kit.ArkTS';

// 声明当前模块为共享模块,只能导出可Sendable数据

“use shared”

// 共享模块,TestData全局唯一

@Sendable

export class TestData {

  private keyHandle: string = ‘0’;

  private count_: number = 0;

  private isLoadingShowing: boolean = false;

  lock_: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock()

  private static instance: TestData ;

  private constructor() {}

  public static getInstance(): TestData {

    if (TestData.instance == null) {

      TestData.instance = new TestData();

      console.debug('getInstance  new  ')

    }

    return TestData.instance ;

  }

  async getLoadingShowing(): Promise<boolean> {

    return this.lock_.lockAsync(() => {

      return this.isLoadingShowing;

    })

  }

  async setLoadingShowing(isShow:boolean){

    await this.lock_.lockAsync(() => {

      this.isLoadingShowing = isShow

    })

  }

  async getKeyHandle(): Promise<string> {

    return this.lock_.lockAsync(() => {

      return this.keyHandle;

    })

  }

  async setKeyHandle(keyHandle:string) {

    await this.lock_.lockAsync(() => {

      this.keyHandle = keyHandle;

    })

  }

  public async  getCount():Promise<number>  {

    return this.lock_.lockAsync(() => {

      return this.count_;

    })

  }

  public async increaseCount() {

    await this.lock_.lockAsync(() => {

      this.count_++;

    })

  }

}<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

更多关于HarmonyOS 鸿蒙Next 单例模式的工具类,出现了两个实例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,如果你遇到了单例模式的工具类出现了两个实例的问题,这通常是由于单例模式的实现方式不正确或者存在多线程访问时的竞争条件导致的。

单例模式的正确实现应确保一个类只有一个实例,并提供一个全局访问点。以下是一些可能的检查点:

  1. 检查构造函数:确保类的构造函数是私有的,以防止外部通过new关键字创建实例。

  2. 检查静态变量:单例实例通常存储在静态变量中,确保该变量只被赋值一次。

  3. 线程安全:在多线程环境中,需要使用同步机制(如synchronized关键字)来确保只有一个线程能创建实例。

  4. 双重检查锁定:在需要高性能的场景中,可以使用双重检查锁定来减少同步的开销。

  5. 枚举单例:使用枚举来实现单例模式是一种简单且线程安全的方式,因为它由JVM保证只创建一个实例。

检查你的代码是否遵循了上述原则。如果问题依旧存在,可能是代码中存在其他逻辑错误或并发问题。此时,建议详细审查代码,特别是与单例实例创建和访问相关的部分。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部