首页> 中国专利> 在数据集合中添加元素的方法和装置

在数据集合中添加元素的方法和装置

摘要

本申请公开了一种在数据集合中添加元素的方法和装置。其中,该方法包括:创建被共享给多个线程的第一数据集合;将第一数据集合中的元素列表复制为本地副本,得到第二数据集合;向第二数据集合添加待添加元素,得到第三数据集合,其中,第一数据集合、第二数据集合和第三数据集合均为不可变集合;将第一数据集合替换为第三数据集合,并返回第一添加结果。本申请解决了现有技术在高并发环境下向数据集合添加元素前,需要对其进行加锁操作导致应用该数据集合的程序出现死锁情况的技术问题。

著录项

  • 公开/公告号CN106649307A

    专利类型发明专利

  • 公开/公告日2017-05-10

    原文格式PDF

  • 申请/专利权人 北京国双科技有限公司;

    申请/专利号CN201510714203.1

  • 发明设计人 何恺铎;

    申请日2015-10-28

  • 分类号G06F17/30;

  • 代理机构北京康信知识产权代理有限责任公司;

  • 代理人韩建伟

  • 地址 100086 北京市海淀区双榆树小区知春路76号翠宫饭店8层A间

  • 入库时间 2023-06-19 02:06:38

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-09-20

    授权

    授权

  • 2019-05-24

    著录事项变更 IPC(主分类):G06F17/30 变更前: 变更后: 申请日:20151028

    著录事项变更

  • 2017-06-06

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20151028

    实质审查的生效

  • 2017-05-10

    公开

    公开

说明书

技术领域

本申请涉及计算机领域,具体而言,涉及一种在数据集合中添加元素的方法和装置。

背景技术

在手机、计算机等设备的系统中经常需要使用数据集合,包括添加、删除元素、枚举集合项等操作。在高并发环境下使用数据集合(以下简称集合)进行元素添加等操作时容易出现并发问题。例如某个共享集合内有三个元素,假设为1、2、3,依次枚举集合中每一项,如果不是并发访问的话,则依次返回1、2、3。但是在并发访问时,假设依次枚举1、2,此时另外一个线程在上述共享集合中添加了1个元素4,并且将4添加至2和3之间,那么获取第三个元素的时候就是4,从而获取到的整个集合元素为1、2、4,这时获取到的集合元素显然是错误的。

针对上面提到的并发问题,常见的解决方案是加锁,也就是在访问共享集合前,先锁定整个共享集合,其他线程要向共享集合添加元素的话,必须先等待锁释放。但是这样会影响程序性能,尤其是在高并发环境下,大量使用锁,会导致很多线程等待,甚至死锁情况出现。

针对上述的问题,目前尚未提出有效的解决方案。

发明内容

本申请实施例提供了一种在数据集合中添加元素的方法和装置,以至少解决现有技术在高并发环境下向数据集合添加元素前,需要对其进行加锁操作导致应用该数据集合的程序出现死锁情况的技术问题。

根据本申请实施例的一个方面,提供了一种在数据集合中添加元素的方法,包括:创建被共享给多个线程的第一数据集合;将所述第一数据集合中的元素列表复制为本地副本,得到第二数据集合;向所述第二数据集合添加待添加元素,得到第三数据集合,其中,所述第一数据集合、所述第二数据集合和所述第三数据集合均为不可变集合;以及将所述第一数据集合替换为所述第三数据集合,并返回第一添加结果。

进一步地,在向所述第二数据集合添加待添加元素,得到第三数据集合之后,所述方法还包括:判断所述第三数据集合与所述第二数据集合是否相同,其中,在判断出所述第三数据集合与所述第二数据集合不相同的情况下,将所述第一数据集合替换为所述第三数据集合,并返回所述第一添加结果。

进一步地,在判断所述第三数据集合与所述第二数据集合是否相同之后,所述方法还包括:在判断出所述第三数据集合与所述第二数据集合不相同的情况下,判断所述第一数据集合和所述第二数据集合是否相同,其中,在判断出所述第一数据集合和所述第二数据集合相同的情况下,将所述第一数据集合替换为所述第三数据集合,并返回所述第一添加结果。

进一步地,在判断所述第三数据集合与所述第二数据集合是否相同之后,所述方法还包括:在判断出所述第三数据集合与所述第二数据集合相同的情况下,返回第二添加结果,其中,所述第一添加结果和所述第二添加结果不相同。

进一步地,向所述第二数据集合添加待添加元素,得到第三数据集合包括:获取所述待添加元素;判断所述待添加元素的数量是等于一还是大于一;在判断出所述待添加元素的数量等于一的情况下,向所述第二数据集合添加所述待添加元素,得到第三数据集合;在判断出所述待添加元素的数量大于一的情况下,将所述本地副本转换为目标数据集合,其中,所述目标数据集合为可变集合;添加多个所述待添加元素至所述目标数据集合,并将所述目标数据集合转换为所述第三数据集合。

进一步地,添加多个所述待添加元素至所述目标数据集合包括:判断待添加元素Ai在所述目标数据集合中是否存在,其中,i依次取1至n,n为所述待添加元素的数量,且n大于或者等于2;在判断出所述待添加元素Ai在所述目标数据集合中存在的情况下,不添加所述待添加元素Ai至所述目标数据集合;在判断出所述待添加元素Ai在所述目标数据集合中不存在的情况下,添加所述待添加元素Ai至所述目标数据集合。

根据本申请实施例的另一方面,还提供了一种在数据集合中添加元素的装置,包括:创建单元,用于创建被共享给多个线程的第一数据集合;复制单元,用于将所述第一数据集合中的元素列表复制为本地副本,得到第二数据集合;添加单元,用于向所述第二数据集合添加待添加元素,得到第三数据集合,其中,所述第一数据集合、所述第二数据集合和所述第三数据集合均为不可变集合;以及替换单元,用于将所述第一数据集合替换为所述第三数据集合,并返回第一添加结果。

进一步地,所述装置还包括:第一判断单元,用于在向所述第二数据集合添加待添加元素,得到第三数据集合之后,判断所述第三数据集合与所述第二数据集合是否相同,其中,在判断出所述第三数据集合与所述第二数据集合不相同的情况下,将所述第一数据集合替换为所述第三数据集合,并返回所述第一添加结果。

进一步地,所述装置还包括:第二判断单元,用于在判断所述第三数据集合与所述第二数据集合是否相同之后,在判断出所述第三数据集合与所述第二数据集合不相同的情况下,判断所述第一数据集合和所述第二数据集合是否相同,其中,在判断出所述第一数据集合和所述第二数据集合相同的情况下,将所述第一数据集合替换为所述第三数据集合,并返回所述第一添加结果。

进一步地,所述装置还包括:返回单元,用于在判断所述第三数据集合与所述第二数据集合是否相同之后,在判断出所述第三数据集合与所述第二数据集合相同的情况下,返回第二添加结果,其中,所述第一添加结果和所述第二添加结果不相同。

进一步地,所述添加单元包括:获取模块,用于获取所述待添加元素;判断模块,用于判断所述待添加元素的数量是等于一还是大于一;第一添加模块,用于在判断出所述待添加元素的数量等于一的情况下,向所述第二数据集合添加所述待添加元素,得到第三数据集合;转换模块,用于在判断出所述待添加元素的数量大于一的情况下,将所述本地副本转换为目标数据集合,其中,所述目标数据集合为可变集合;第二添加模块,用于添加多个所述待添加元素至所述目标数据集合,并将所述目标数据集合转换为所述第三数据集合。

进一步地,所述第二添加模块包括:判断子模块,用于判断待添加元素Ai在所述目标数据集合中是否存在,其中,i依次取1至n,n为所述待添加元素的数量,且n大于或者等于2;第一处理子模块,用于在判断出所述待添加元素Ai在所述目标数据集合中存在的情况下,不添加所述待添加元素Ai至所述目标数据集合;第二处理子模块,用于在判断出所述待添加元素Ai在所述目标数据集合中不存在的情况下,添加所述待添加元素Ai至所述目标数据集合。

在本申请实施例中,采用创建被共享给多个线程的第一数据集合;将所述第一数据集合中的元素列表复制为本地副本,得到第二数据集合;向所述第二数据集合添加待添加元素,得到第三数据集合,其中,所述第一数据集合、所述第二数据集合和所述第三数据集合均为不可变集合;以及将所述第一数据集合替换为所述第三数据集合,并返回第一添加结果。通过将在高并发环境下共享给多个线程的第一数据集合创建为不可变集合,进而将上述第一数据集合保存为本地副本,以得到第二数据集合,再向第二数据集合中添加元素以得到包含了添加的元素的第三数据集合,最后将最初创建的不可变集合(也即第一数据集合)与添加元素后的不可变集合(即,第三数据集合)进行替换,达到了在高并发环境下,向数据集合添加元素前无需对该数据集合进行加锁操作的目的,从而解决了现有技术在高并发环境下向数据集合添加元素前,需要对其进行加锁操作导致应用该数据集合的程序出现死锁情况的技术问题,达到了提高应用该数据集合的程序的工作稳定性的技术效果。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请实施例的一种在数据集合中添加元素的方法的流程图;

图2是根据本申请实施例的一种可选的在数据集合中添加元素的方法的流程图;以及

图3是根据本申请实施例的一种在数据集合中添加元素的装置的示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

首先,在对本申请实施例进行描述的过程中出现的部分名词或术语适用于解释如下:

不可变集合:是指在修改集合(例如,向集合添加元素或者删除集合内的元素)时,该集合不会发生变化,而是生成一个新的集合。比如,当向某个不可变集合添加元素时,该集合不会变化,而是返回一个新集合,新集合中包含原集合(即,上文中的该集合)的元素和新添加元素。

根据本申请实施例,提供了一种在数据集合中添加元素的方法,该方法可以应用于高并发环境。图1是根据本申请实施例的一种在数据集合中添加元素的方法的流程图,如图1所示,该方法包括如下步骤:

步骤S102,创建被共享给多个线程的第一数据集合。

具体地,第一数据集合中包括用于存储元素的元素列表,其中,元素的数量可以为一个,也可以为多个。

例如,步骤S102中创建了一个第一数据集合,该第一数据集合的元素列表中存储有3个元素,分别为a、b和c。

步骤S104,将第一数据集合中的元素列表复制为本地副本,得到第二数据集合。

继续采用上述举例进行说明,将步骤S102中创建的第一数据集合的元素列表复制为本地副本,则得到第二数据集合,其中,第二数据集合中的元素与第一数据集合中的元素相同,也即,第二数据集合中也包含3个元素,分别为a、b和c。

步骤S106,向第二数据集合添加待添加元素,得到第三数据集合。

具体地,上述第一数据集合、第二数据集合和第三数据集合均为不可变集合。根据前面对不可变集合的解释说明可知,使用不可变集合的好处是支持高并发,因为集合是不可变的,所以在高并发的环境下,即使有多个线程对该数据集合进行修改(例如,添加元素)时也无需对上述数据集合进行加锁操作。

由于第二数据集合是不可变集合,所以向第二数据集合添加元素时,会返回(得到)一个新的数据集合(也即,步骤S106中的第三数据集合)。例如,添加元素d至第二数据集合,则会得到新的数据集合(即,第三数据集合),该新的数据集合中包含4个元素,分别是a、b、c和d。

步骤S108,将第一数据集合替换为第三数据集合,并返回第一添加结果。

具体地,第一添加结果可以为true,表明添加成功。

将第一数据集合替换为第三数据集合后,会将第三数据集合作为新的第一数据集合仍旧共享给多个线程,根据上述举例可知,此时新的第一数据集合中(也即替换了第一数据集合的第三数据集合)包含的元素为a、b、c和d。

需要说明的是,由于第三数据集合也是不可变集合,因此将第一数据集合替换为包含了新添加元素的第三数据集合后,若向第三数据集合添加元素,无需对第三数据集合进行加锁操作。

在本申请实施例中,通过将在高并发环境下共享给多个线程的第一数据集合创建为不可变集合,进而通过将上述第一数据集合中存储元素的元素列表保存为本地副本来得到第二数据集合,再向第二数据集合中添加元素即可得到包含了新添加的元素的第三数据集合,最后将最初创建的不可变集合(也即第一数据集合)与添加新元素后的不可变集合(即,第三数据集合)进行替换,达到了在高并发环境下,向数据集合添加元素前无需对该数据集合进行加锁操作的目的,从而解决了现有技术在高并发环境下向数据集合添加元素前,需要对其进行加锁操作导致应用该数据集合的程序出现死锁情况的技术问题,达到了提高应用该数据集合的程序的工作稳定性的技术效果。

可选地,在本申请实施例中,在向第二数据集合添加待添加元素,得到第三数据集合之后,方法还包括步骤S1,具体如下:

步骤S1,判断第三数据集合与第二数据集合是否相同,其中,在判断出第三数据集合与第二数据集合不相同的情况下,将第一数据集合替换为第三数据集合,并返回第一添加结果。

具体地,待添加元素可以为一个,也可以为多个。向第二数据集合添加待添加元素时,如果某个待添加元素在第二数据集合中已经存在,则不向第二数据集合添加上述已经存在的待添加元素,也即,只向添加第二数据集合中添加其内不存在的待添加元素,但是不论是否成功添加元素至第二数据集合,根据不可变集合的特点,都会返回(得到)一个新的数据集合,即第三数据集合。

基于上述说明,对于待添加元素为一个的情况,如果上述一个待添加元素在第二数据集合内已存在,则得到的第三数据集合与第二数据集合相同;如果上述一个待添加元素在第二数据集合内不存在,则得到的第三数据集合与第二数据集合不同。对于待添加元素为多个的情况,如果上述多个待添加元素在第二数据集合内均已存在,则得到的第三数据集合与第二数据集合相同;如果多个待添加元素中有至少一个待添加元素在第二数据集合中不存在,则得到的第三数据集合与第二数据集合不同,并且得到的第三数据集合中包含第二数据集合中的元素以及后添加的元素。

在本申请实施例中,通过将添加元素后的不可变集合与未添加元素前的不可变集合进行对比,在确定了添加元素后的不可变集合成功添加元素后才将最初被共享给多个线程的不可变集合替换为上述成功添加元素后的不可变集合。

需要说明的是,上述添加元素后的不可变集合是指执行了添加元素操作的不可变集合,但执行了添加元素操作,并不代表就能成功的将元素添加至不可变集合。

可选地,在本申请实施例中,在判断第三数据集合与第二数据集合是否相同之后,方法还包括步骤S3,具体如下:

步骤S3,在判断出第三数据集合与第二数据集合不相同的情况下,判断第一数据集合和第二数据集合是否相同,其中,在判断出第一数据集合和第二数据集合相同的情况下,将第一数据集合替换为第三数据集合,并返回第一添加结果。

具体地,为了保证某个线程的用户能够有效的向第一数据集合中添加元素,在判断出第三数据集合与第二数据集合不同后,还需判断第一数据集合与第二数据集合是否相同,也即,判断第一数据集合与第二数据集合相比是否发生变化,若判断出第一数据集合与第二数据集合相同,也即,判断出第一数据集合与第二数据集合相比未发生变化,说明在该线程的用户添加元素至第一数据集合的过程中,没有其它线程的用户对第一数据集合进行修改,则将第一数据集合替换为第三数据集合;若判断出第一数据集合与第二数据集合不相同,也即,判断出第一数据集合与第二数据集合相比发生了变化,说明在该线程的用户添加元素至第一数据集合的过程中,其它线程的用户对第一数据集合进行了修改,那么需要获取元素发生变化后的第一数据集合,并且对上述元素发生变化后的第一数据集合重复执行步骤S104至步骤S108,以完成向元素发生变化后的第一数据集合添加元素。

可选地,在本申请实施例中,在判断第三数据集合与第二数据集合是否相同之后,方法还包括:在判断出第三数据集合与第二数据集合相同的情况下,返回第二添加结果,其中,第一添加结果和第二添加结果不相同。

具体地,第二添加结果可以为false,表明添加失败。

在本申请实施例中,通过反馈添加结果,使得用户能够较为直观的了解向被共享的数据集合添加元素是否成功,达到了提高用户满意度的效果。

继续采用上述举例进行说明,如果待添加元素为a,由于第二数据集合中已经存在a,则不会向第二数据集合内添加a,但仍会得到一个新的数据集合(即,第三数据集合),此时的第三数据集合中包含3个元素,分别是a、b和c,说明第三数据集合与第二数据集合中包含的元素相同,由此得出第三数据集合与第二数据集合相同,这时返回表明失败的添加结果;如果待添加元素为d,由于第二数据集合中不存在d,则向第二数据集合内添加d,同样仍会得到一个新的数据集合(即,第三数据集合),但是此时的第三数据集合中包含4个元素,分别是a、b、c和d,说明第三数据集合与第二数据集合中包含的元素不相同,由此得知第三数据集合和第二数据集合不相同,这时将第一数据集合替换为第三数据集合,并返回表明添加成功的添加结果。

可选地,在本申请实施例中,步骤S106中向第二数据集合添加待添加元素,得到第三数据集合包括:获取待添加元素;判断待添加元素的数量是等于一还是大于一,也即,判断有一个待添加元素还是有多个待添加元素;在判断出待添加元素的数量等于一(也即,有一个待添加元素)的情况下,向第二数据集合添加待添加元素,得到第三数据集合;在判断出待添加元素的数量大于一(也即,有多个待添加元素)的情况下,将本地副本转换为目标数据集合,其中,目标数据集合为可变集合;添加多个待添加元素至目标数据集合,并将目标数据集合转换为第三数据集合。

具体地,若判断出待添加元素为多个时,将得到本地副本由不可变集合转换为可变集合后得到一个新的数据集合(即,目标数据集合),进而直接向目标数据集合添加待添加元素,再将既包含新添加的元素,又包含第二数据集合内元素的可变集合转换为不可变的第三数据集合。

可选地,在本申请实施例中,添加多个待添加元素至目标数据集合包括:判断待添加元素Ai在目标数据集合中是否存在,其中,i依次取1至n,n为待添加元素的数量,且n大于或者等于2;在判断出待添加元素Ai在目标数据集合中存在的情况下,不添加待添加元素Ai至目标数据集合;在判断出待添加元素Ai在目标数据集合中不存在的情况下,添加待添加元素Ai至目标数据集合。

为了方便对本申请的理解,对待添加元素为多个的情况,进行如下举例说明。假设:待添加元素为三个,分别是m、n和c;第二数据集合中包含3个元素,分别是a、b和c,也即,本地副本中包含3个元素分别是a、b和c。首先,获取待添加元素m、n和c,接下来判断待添加元素的数量是一个还是多个,通过判断可知,待添加元素的数量为多个,则将上述实施例中得到的本地副本转换为可变集合,也即得到目标数据集合,其中,目标数据集合中包含元素a、b和c。接下来依次添加待添加元素m、n和c至目标数据集合,由于目标数据集合中不存在待添加元素m,则将待添加元素m添加至目标数据集合;同样的由于目标数据集合中不存在待添加元素n,则将待添加元素n添加至目标数据集合;由于目标数据集合中已存在待添加元素c,则不添加待添加元素c至目标数据集合,此时得到的目标数据集合中包含的元素有5个,分别是a、b、c、m和n。再将目标数据集合转换为不可变集合,也即得到第三数据集合。

图2是根据本申请实施例的一种可选的在数据集合中添加元素的方法的流程图,如图2所示,该方法包括如下步骤:

步骤S202,创建被共享给多个线程的第一数据集合,该步骤同步骤S102,在此不再说明。

同样的,第一数据集合为不可变集合,并且其内包含存储元素的元素列表。

步骤S204,将第一数据集合中的元素列表复制为本地副本,得到第二数据集合,该步骤同步骤S104,在此不再说明。

步骤S206,判断待添加元素是一个还是多个。其中,在待添加元素为一个的情况下,执行步骤S222至步骤S230;在判断出待添加元素为多个的情况下,执行步骤S208至步骤S220。

步骤S208,将本地副本转换为可变集合,得到目标数据集合。具体地,目标数据集合为可变集合。

步骤S210,向目标数据集合添加待添加元素。具体地,如果某个待添加元素在目标数据集合中已经存在,则不添加;如果某个待添加元素在目标数据集合中不存在,则添加,也即,只向目标数据集合添加该目标数据集合内不存在的元素。

需要说明的是,由于目标数据集合为可变集合,所以可以直接将待添加元素添加至目标数据集合,并且不会返回新的数据集合。

步骤S212,将添加元素后的目标数据集合进行转换,得到第三数据集合。

具体地,将将添加元素后的目标数据集合转换为不可变集合,上述不可变集合即为第三数据集合。

步骤S214,判断第三数据集合和第二数据集合是否相同。该步骤同步骤S1,在此不再赘述。其中,在判断出第三数据集合和第二数据集合不同的情况下,执行步骤S216;在判断出第三数据集合和第二数据集合相同的情况下,执行步骤S218。

步骤S216,获取第一数据集合,并判断获取到的第一数据集合与第二数据集合是否相同,该步骤同步骤S3,在此不再重复说明。其中,在判断出第一数据集合和第二数据集合不同的情况下,返回步骤S204;在判断出第一数据集合和第二数据集合相同的情况下,执行步骤S220。

步骤S218,返回第二添加结果。具体地,第二添加结果可以为false,表明添加失败。

步骤S220,将第一数据集合替换为第三数据集合,并返回第一添加结果。该步骤相当于步骤S108,在此不再赘述。

步骤S222,添加元素至第二数据集合,得到第三数据集合,该步骤相当于步骤S106,在此不再赘述。

步骤S224,判断第三数据集合与第二数据集合是否相同,该步骤同步骤S1,在此不再赘述。其中,在判断出第三数据集合和第二数据集合不同的情况下,执行步骤S226;在判断出第三数据集合和第二数据集合相同的情况下,执行步骤S228。

步骤S226,获取第一数据集合,并判断获取到的第一数据集合与第二数据集合是否相同,该步骤同步骤S3,在此不再重复说明。其中,在判断出第一数据集合和第二数据集合不同的情况下,返回步骤S204;在判断出第一数据集合和第二数据集合相同的情况下,执行步骤S230。

步骤S228,返回第二添加结果。具体地,第二添加结果可以为false,表明添加成功。

步骤S230,将第一数据集合替换为第三数据集合,并返回第一添加结果,该步骤相当于步骤S108,在此不再赘述。

在本申请实施例中,通过将在高并发环境下共享给多个线程的数据集合创建为不可变集合,这样不论有多少个线程同时对该数据集合进行修改,都不是直接对该数据集合修改,而是返回一个新的数据集合,从而无需在向该数据集合添加元素前对其进行加锁操作,进而保证了在向该数据集合添加元素时不影响其它线程对该集合的使用。

根据本申请实施例,还提供了一种在数据集合中添加元素的装置,该装置也可以应用于高并发环境,该在数据集合中添加元素的装置用于执行本申请实施例上述内容所提供的在数据集合中添加元素的方法,以下对本申请实施例所提供的在数据集合中添加元素的装置做具体介绍:

图3是根据本申请实施例的一种在数据集合中添加元素的装置的示意图,如图3所示,该控制装置主要包括创建单元31、复制单元33、添加单元35和替换单元37,其中:

创建单元31用于创建被共享给多个线程的第一数据集合。

例如,创建单元31中创建了一个第一数据集合,该第一数据集合的元素列表中存储有3个元素,分别为a、b和c。

复制单元33用于将第一数据集合中的元素列表复制为本地副本,得到第二数据集合。

继续采用上述举例进行说明,将创建单元31中创建的第一数据集合的元素列表复制为本地副本,则得到第二数据集合,其中,第二数据集合中的元素与第一数据集合中的元素相同,也即,第二数据集合中也包含3个元素,分别为a、b和c。

添加单元35用于向第二数据集合添加待添加元素,得到第三数据集合,其中,第一数据集合、第二数据集合和第三数据集合均为不可变集合。

具体地,上述第一数据集合、第二数据集合和第三数据集合均为不可变集合。根据前面对不可变集合的解释说明可知,使用不可变集合的好处是支持高并发,因为集合是不可变的,所以在高并发的环境下,即使有多个线程对该集合进行修改(例如,添加元素)时也无需对上述数据集合进行加锁操作。

由于第二数据集合是不可变集合,所以向第二数据集合添加元素时,会返回(得到)一个新的数据集合(也即,添加单元35中的第三数据集合)。例如,添加元素d至第二数据集合,则会得到新的数据集合(即,第三数据集合),该新的数据集合中包含4个元素,分别是a、b、c和d。

替换单元37用于将第一数据集合替换为第三数据集合,并返回第一添加结果。

将第一数据集合替换为第三数据集合后,会将第三数据集合作为新的第一数据集合仍旧共享给多个线程,根据上述举例可知,此时新的第一数据集合中(也即替换了第一数据集合的第三数据集合)包含的元素为a、b、c和d。

需要说明的是,由于第三数据集合也是不可变集合,因此将第一数据集合替换为包含了新添加元素的第三数据集合后,若向第三数据集合添加元素,同样对第三数据集合进行加锁操作。

在本申请实施例中,通过将在高并发环境下共享给多个线程的第一数据集合创建为不可变集合,进而通过将上述第一数据集合中存储元素的元素列表保存为本地副本来以得到第二数据集合,再向第二数据集合中添加元素即可得到包含了新添加的元素的第三数据集合,最后将最初创建的不可变集合(也即第一数据集合)与添加新元素后的不可变集合(即,第三数据集合)进行替换,达到了在高并发环境下,向数据集合添加元素前无需对该数据集合进行加锁操作的目的,从而解决了现有技术在高并发环境下向数据集合添加元素前,需要对其进行加锁操作导致应用该数据集合的程序出现死锁情况的技术问题,达到了提高应用该数据集合的程序的工作稳定性的技术效果。

可选地,在本申请实施例中,装置还包括第一判断单元。其中,第一判断单元用于在向第二数据集合添加待添加元素,得到第三数据集合之后,判断第三数据集合与第二数据集合是否相同,其中,在判断出第三数据集合与第二数据集合不相同的情况下,将第一数据集合替换为第三数据集合,并返回第一添加结果。

在本申请实施例中,通过将添加元素后的不可变集合与未添加元素前的不可变集合进行对比,在确定了添加元素后的不可变集合成功添加元素后才将最初被共享给多个线程的不可变集合替换为上述成功添加元素后的不可变集合。

需要说明的是,上述添加元素后的不可变集合是指执行了添加元素操作的不可变集合,但执行了添加元素操作,并不代表就能成功的将元素添加至不可变集合。

可选地,在本申请实施例中,装置还包括第二判断单元。其中,第二判断单元用于在判断第三数据集合与第二数据集合是否相同之后,在判断出第三数据集合与第二数据集合不相同的情况下,判断第一数据集合和第二数据集合是否相同,其中,在判断出第一数据集合和第二数据集合相同的情况下,将第一数据集合替换为第三数据集合,并返回第一添加结果。

具体地,为了保证某个线程的用户能够有效的向第一数据集合中添加元素,在判断出第三数据集合与第二数据集合不同后,还需判断第一数据集合与第二数据集合是否相同,也即,判断第一数据集合与第二数据集合相比是否发生变化,若判断出第一数据集合与第二数据集合相同,也即,判断出第一数据集合与第二数据集合相比未发生变化,说明在该线程的用户添加元素至第一数据集合的过程中,没有其它线程的用户对第一数据集合进行修改,则将第一数据集合替换为第三数据集合;若判断出第一数据集合与第二数据集合不相同,也即,判断出第一数据集合与第二数据集合相比发生了变化,说明在该线程的用户添加元素至第一数据集合的过程中,其它线程的用户对第一数据集合进行了修改,那么需要获取元素发生变化后的第一数据集合,并且对上述元素发生变化后的第一数据集合重复调用复制单元33、添加单元35和替换单元37,以完成向元素发生变化后的第一数据集合添加元素。

可选地,在本申请实施例中,装置还包括:返回单元,用于在判断第三数据集合与第二数据集合是否相同之后,在判断出第三数据集合与第二数据集合相同的情况下,返回第二添加结果,其中,第一添加结果和第二添加结果不相同。

在本申请实施例中,通过反馈添加结果,使得用户能够较为直观的了解向被共享的数据集合添加元素是否成功,达到了提高用户满意度的效果。

继续采用上述举例进行说明,如果待添加元素为a,由于第二数据集合中已经存在a,则不会向第二数据集合内添加a,但仍会得到一个新的数据集合(即,第三数据集合),此时的第三数据集合中包含3个元素,分别是a、b和c,说明第三数据集合与第二数据集合中包含的元素相同,由此得出第三数据集合与第二数据集合相同,这时返回表明失败的添加结果;如果待添加元素为d,由于第二数据集合中不存在d,则向第二数据集合内添加d,同样仍会得到一个新的数据集合(即,第三数据集合),但是此时的第三数据集合中包含4个元素,分别是a、b、c和d,说明第三数据集合与第二数据集合中包含的元素不相同,由此得知第三数据集合和第二数据集合不相同,这时将第一数据集合替换为第三数据集合,并返回表明添加成功的添加结果。

可选地,在本申请实施例中,添加单元包括获取模块、判断模块、第一添加模块、转换模块和第二添加模块。其中,获取模块用于获取待添加元素;判断模块用于判断待添加元素的数量是等于一还是大于一;第一添加模块用于在判断出待添加元素的数量等于一的情况下,向第二数据集合添加待添加元素,得到第三数据集合;转换模块用于在判断出待添加元素的数量大于一的情况下,将本地副本转换为目标数据集合,其中,目标数据集合为可变集合;第二添加模块用于添加多个待添加元素至目标数据集合,并将目标数据集合转换为第三数据集合。

具体地,若判断出待添加元素为多个时,将得到本地副本由不可变集合转换为可变集合后得到一个新的数据集合(即,目标数据集合),进而直接向目标数据集合添加待添加元素,再将既包含新添加的元素,又包含第二数据集合内元素的可变集合转换为不可变的第三数据集合。

可选地,在本申请实施例中,第二添加模块包括判断子模块、第一处理子模块和第二处理子模块。其中,判断子模块用于判断待添加元素Ai在目标数据集合中是否存在,其中,i依次取1至n,n为待添加元素的数量,且n大于或者等于2;第一处理子模块用于在判断出待添加元素Ai在目标数据集合中存在的情况下,不添加待添加元素Ai至目标数据集合;第二处理子模块用于在判断出待添加元素Ai在目标数据集合中不存在的情况下,添加待添加元素Ai至目标数据集合。

为了方便对本申请的理解,对待添加元素为多个的情况,进行如下举例说明。假设:待添加元素为三个,分别是m、n和c;第二数据集合中包含3个元素,分别是a、b和c,也即,本地副本中包含3个元素分别是a、b和c。首先,获取待添加元素m、n和c,接下来判断待添加元素的数量是一个还是多个,通过判断可知,待添加元素的数量为多个,则将上述实施例中得到的本地副本转换为可变集合,也即得到目标数据集合,其中,目标数据集合中包含元素a、b和c。接下来依次添加待添加元素m、n和c至目标数据集合,由于目标数据集合中不存在待添加元素m,则将待添加元素m添加至目标数据集合;同样的由于目标数据集合中不存在待添加元素n,则将待添加元素n添加至目标数据集合;由于目标数据集合中已存在待添加元素c,则不添加待添加元素c至目标数据集合,此时得到的目标数据集合中包含的元素有5个,分别是a、b、c、m和n。再将目标数据集合转换为不可变集合,也即得到第三数据集合。

所述在数据集合中添加元素的装置包括处理器和存储器,上述创建单元、复制单元、添加单元和替换单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元。

处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数提高了应用数据集合的程序的工作稳定性,解决了现有技术在高并发环境下向数据集合添加元素前,需要对其进行加锁操作导致应用该数据集合的程序出现死锁情况的技术问题。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。

本申请还提供了一种计算机程序产品的实施例,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序代码:创建被共享给多个线程的第一数据集合;将第一数据集合中的元素列表复制为本地副本,得到第二数据集合;向第二数据集合添加待添加元素,得到第三数据集合;以及将第一数据集合替换为第三数据集合,并返回第一添加结果。

上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。

在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号