CN108733361B - 一种实现并发容器的方法和装置 - Google Patents

一种实现并发容器的方法和装置 Download PDF

Info

Publication number
CN108733361B
CN108733361B CN201710261006.8A CN201710261006A CN108733361B CN 108733361 B CN108733361 B CN 108733361B CN 201710261006 A CN201710261006 A CN 201710261006A CN 108733361 B CN108733361 B CN 108733361B
Authority
CN
China
Prior art keywords
container
data
child
sequence number
parent
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201710261006.8A
Other languages
English (en)
Other versions
CN108733361A (zh
Inventor
张志维
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Century Trading Co Ltd, Beijing Jingdong Shangke Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN201710261006.8A priority Critical patent/CN108733361B/zh
Publication of CN108733361A publication Critical patent/CN108733361A/zh
Application granted granted Critical
Publication of CN108733361B publication Critical patent/CN108733361B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供一种实现并发容器的方法和装置,有助于通过增加子容器的方式,而在内存上物理隔离数据,从而减少了由于轮询容器锁而引起的CPU消耗。该方法的特征在于,该并发容器是由多个子容器组成的父容器,按如下步骤对该父容器进行创建:向该父容器中的一个子容器添加数据,并记录所添加的数据在该父容器中的序号,当所添加的数据的量达到第一阈值时,在内存中创建一个新的子容器;以及继续向所创建的新的子容器中添加数据,并记录所添加的数据在该父容器中的序号,当所添加的数据的量达到第一阈值时,在内存中再次创建另一新的子容器;以此类推,直至所有数据被添加至父容器为止,其中子容器在内存中彼此物理隔离。

Description

一种实现并发容器的方法和装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种实现并发容器的方法和装置。
背景技术
在编写程序的时常常需要对大量的对象引用进行管理。为了实现有效的归类管理,将同类的引用放置在同一数据容器中。例如,JAVA容器是JAVA API(ApplicationProgramming Interface,应用程序接口)所提供的一系列类的实例,用于在程序中存放对象,可以被理解为存放数据的集合。由于在数据容器中存放了随时可能被使用的对象引用,所以一般的数据容器均提供查询、遍历、修改等基本接口功能。
JAVA容器分为同步容器和并发容器。同步容器包括Vector,Hashtable等。在使用同步容器的情况下,同步容器通过封装线程的状态来实现线程安全,即当线程尝试对容器中的数据进行操作时,需要占据该容器的锁,以防止其他线程影响数据。如果多个线程调用同步容器,则这些线程将会通过抢占容器的独占锁来串行执行对同步容器的调用,从而降低了并发性。当多个线程竞争容器的独占锁时,吞吐量严重下降。所以在需要支持线程并发的环境中,可以考虑使用并发容器来替代同步容器。并发容器是针对多个线程并发访问容器而设计的,并发容器包括ConcurrentHashMap,CopyOnWriteArrayList等。并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性,例如在ConcurrentHashMap中采用了一种粒度更细的加锁机制,可以称为分段锁,在这种锁机制下,允许任意数量的读操作线程并发地访问容器,并且读操作线程和写操作线程也可以并发的访问容器,同时允许一定数量的写操作线程并发地修改容器,所以并发容器可以在并发环境下实现更高的吞吐量。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:在目前的编程过程中,为避免并发操作某个集合导致数据一致性的差异(例如:集合中一个数据同时被多个线程修改,则无法确定哪个线程最后修改的该条数据),通常采用支持并发操作的集合(例如:CopyOnWriteArrayList等)。在日常使用容器过程中经常会遇到这样一个场景:多个线程同时往一个支持并发操作的容器中写入数据,一个线程从该容器中随机读取数据进行处理。此时多个线程抢夺该容器的同步锁,抢到锁的线程对数据进行修改或者读取,未抢到锁的线程此时一直等待获得同步锁。此时大量的CPU资源消耗在了等待获得同步锁的过程中,造成处理性能随着容器中数据量的增加而降低。虽然并发容器CopyOnWriteArrayList的性能已经优于同步容器Vector,但在实际使用中,某些大并发场景仍然无法满足需求。
图1是现有技术中同步容器的流程图。以向同步容器中添加数据为例:在步骤S101中,一个线程开始尝试操作数据;在步骤S12中,该线程请求同步容器的独占锁;如果在S102中该线程未能成功获得容器的独占锁,则进入步骤S103,该线程循环请求锁,直至获得该容器的独占锁;如果在S102中该线程成功获得容器的独占锁,则进入步骤S104,该线程对数据进行操作;接下来,在步骤S105中,在该线程完成数据操作后,释放所占据的独占锁;至此,完成向同步容器中添加数据的操作。
可见,当有大量并发线程同时请求操作一个同步容器时,只有一个线程可以获得锁,然后对数据进行操作。其他所有线程都会不停地对该容器进行轮询,直到获得锁为止。轮询锁的操作会产生CPU消耗,当线程的并发量很大时,CPU消耗随之增大,从而导致CPU处理能力降低以及处理速度变慢,这反过来进一步导致积压的请求锁的线程数增加,使得CPU消耗更加加剧。如此恶性循环下来,导致并发量较大时,Vector等同步容器性能持续降低。
在另一方面,现有的基于队列的并发容器(例如ConcurrentLinkedQueue)虽然效率高于Vector但是无法满足随机存取的需求。例如,ConcurrentLinkedQueue采用链表的结构存储数据,在查找一个随机位置的数据时,必须从起始位置或者结尾处逐个对象查找,直至找到对应位置的数据对象为止。此外,对于并发容器可能产生ABA的问题,即在一个线程对某一参数V进行CAS(Compare and Swap,比较并交换)操作时,假设V原先为A,如果另一个线程将V修改成B,再修改回A,则当前线程的CAS操作无法分辨当前V值是否发生过变化。所以,现有技术中的并发容器在某些场景下并不适用。
发明内容
有鉴于此,本发明实施例提供一种实现并发容器的方法和装置,能够有助于通过增加子容器的方式,而在内存上物理隔离数据,从而减少了由于轮询容器锁而引起的CPU消耗,并通过实现对并发容器的随机存取而增加并发容器的使用效率,从而降低对物理服务器的要求,减少服务器成本,提高生产效率。本发明所涉的编程语言包括但不限于JAVA等。
为实现上述目的,根据本发明实施例的一个方面,提供了一种实现并发容器的方法。
本发明是一种实现并发容器的方法,其特征在于,所述并发容器是由多个子容器组成的父容器,按如下步骤对所述父容器进行创建:向所述父容器中的一个子容器添加数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到第一阈值时,在内存中创建一个新的子容器;以及继续向所创建的新的子容器中添加所述数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到所述第一阈值时,在内存中再次创建另一新的子容器;以此类推,直至所有数据都被添加至所述父容器为止,其中所述子容器在内存中彼此物理隔离。
可选地,还包括:所述父容器对所述子容器进行管理。
可选地,还包括:所述父容器中设有一个计数器,所述计数器的计数器值指示所有所述子容器的数据量之和。
可选地,还包括:在创建所述父容器后,当一个线程对所述父容器中的数据进行操作时,根据所述数据的序号以及所述子容器的数据量判断所述数据存储于哪一个所述子容器中;所述线程获取所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁;所述线程对所述数据进行操作,然后释放所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁,以允许其他线程进行操作;所述父容器更新所述计数器值以及所述数据的序号。
可选地,还包括:在创建所述父容器后,当一个线程向所述父容器中其所存储的数据的序号为最大序号的子容器添加新数据时,所述线程获取中其所存储的数据的序号为最大序号的子容器的锁;所述线程向其所存储的数据的序号为最大序号的所述子容器添加数据,然后释放其所存储的数据的序号为最大序号的子容器的锁,以允许其他线程进行操作;所述父容器更新所述计数器值以及所述数据的序号。
可选地,还包括:设置第二阈值,所述第二阈值大于所述第一阈值;在创建所述父容器后,当一个线程向所述父容器中的子容器的起始位置添加所述数据时,将所述数据添加至其所存储的数据的序号比所述数据的序号小1的子容器的末尾位置,其中,所述数据所添加至的子容器的数据量小于所述第二阈值。
可选地,还包括:其中,所述父容器能够是并发容器或同步容器,与所述父容器对应的所述子容器也能够是并发容器或同步容器。
为实现上述目的,根据本发明实施例的另一方面,提供了一种实现并发容器的装置。
本发明的一种实现并发容器的装置,其特征在于,所述并发容器是由多个子容器组成的父容器,所述装置包括数据操作模块和子容器创建模块,其中,在对所述父容器进行创建时:所述数据操作模块向所述父容器中的一个子容器添加数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到第一阈值时,所述数据操作模块通知所述子容器创建模块在内存中创建一个新的子容器;所述数据操作模块继续向所创建的新的子容器中添加所述数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到所述第一阈值时,所述数据操作模块通知所述子容器创建模块在内存中再次创建另一新的子容器,以此类推,直至所有数据都被添加至所述父容器为止,其中所述子容器在内存中彼此物理隔离。
可选地,还包括子容器管理模块:所述父容器通过所述子容器管理模块对所述子容器进行管理。
可选地,还包括:所述父容器中设有一个计数器,所述计数器的计数器值指示所有所述子容器的数据量之和。
可选地,还包括:在创建所述父容器后,当一个线程对所述父容器中的所述数据进行操作时,所述数据操作模块根据所述数据的序号以及所述子容器的数据量判断所述数据存储于哪一个所述子容器中;所述线程获取所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁;所述线程通过所述数据操作模块对所述数据进行操作,然后释放所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁,以允许其他线程进行操作;所述父容器通过所述数据操作模块更新所述计数器值以及所述数据的序号。
可选地,还包括:在创建所述父容器后,当一个线程向所述父容器中其所存储的数据的序号为最大序号的子容器添加所述数据时,所述线程获取其所存储的数据的序号为最大序号子容器的锁;所述线程通过所述数据操作模块向其所存储的数据的序号为最大序号的子容器添加所述数据,然后释放其所存储的数据的序号为最大序号的子容器的锁,以允许其他线程进行操作;所述父容器通过所述数据操作模块更新所述计数器值以及所述数据的序号。
可选地,还包括:在数据操作模块中设置第二阈值,所述第二阈值大于所述第一阈值;在创建所述父容器后,当一个线程向所述父容器中的子容器的起始位置添加所述数据时,通过所述数据操作模块将所述数据添加至其所存储的数据的序号比所述数据的序号小1的子容器的末尾位置,其中,所述数据所添加至的子容器的数据量小于所述第二阈值。
可选地,还包括:其中,所述父容器能够是并发容器或同步容器,与所述父容器对应的所述子容器也能够是并发容器或同步容器。
根据本发明的又一方面,提供了一种电子设备。
本发明的一种电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器能够执行本发明所提供的实现并发容器的方法。
根据本发明的再一方面,提供了一种计算机可读介质。
本发明的一种计算机可读介质存储有计算机程序,其特征在于,所述程序被处理器执行时能够执行本发明所提供的实现并发容器的方法。
上述发明中的一个实施例具有如下优点或有益效果:因为采用通过增加子容器的方式而在内存上物理隔离数据的技术手段,所以克服了由于轮询容器锁而引起的CPU消耗及性能降低的技术问题,并通过实现对并发容器的随机存取而增加并发容器的使用效率,进而达到降低对物理服务器的要求、减少服务器成本以及提高生产效率的技术效果。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是现有技术中同步容器的流程图;
图2是根据本发明实施例的对父容器进行创建示意图;
图3是根据本发明实施例的父容器与子容器在内存中的关系的示意图;
图4是根据本发明实施例的对父容器中的数据进行操作的流程图;
图5是根据本发明实施例的向父容器中最后一个子容器添加数据的流程图;
图6是根据本发明实施例的向父容器中的子容器的起始位置添加数据的流程图;
图7是根据本发明实施例的实现并发容器的装置的示意图;
图8是适于用来实现本申请实施例的终端设备或服务器的计算机系统的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图2是根据本发明实施例的对父容器进行创建示意图。如图2所示,对父容器进行创建即为向父容器中添加数据。本实施例中,父容器由多个子容器组成,父容器包括一个计数器,其计数器值指示了所有子容器的数据量之和。通常在诸如JAVA的编程语言的容器中含有统计容器的数据量的方法,例如,size(),因而,可通过调用各子容器的size()方法来统计父容器的计数器值,即,假设有n个子容器,则:
计数器值=子容器1.size()+子容器2.size()+…+子容器n.size()
此外,本实施例中的父容器能够是同步容器或者并发容器,构成父容器的对应子容器也能够是同步容器或者并发容器。
在步骤S201中,开始向父容器添加数据,在初始添加时,父容器被视为第一子容器(子容器1),随着添加的数据量的增多,根据下文步骤在内存中创建若干子容器,例如,第二子容器(子容器2)、第三子容器(子容器3)、……第n子容器(子容器n),直至所有数据被添加至父容器中为止,其中,每个子容器包含第一阈值数量的数据。
在步骤S202中,判断当前子容器中的数据量是否达到第一阈值,如果达到第一阈值,则进行到步骤S203。
在步骤S203中,在内存中创建一个新的子容器,以继续进行数据添加。
在步骤S205中,尝试获得新建子容器的锁。如果未获得新建子容器的锁,则进行到步骤S204,循环尝试请求新建子容器的锁,直至获得新建子容器的锁;如果获得新建子容器的锁,则进行到步骤S206。
在步骤S206中,将数据添加到新建子容器中。
在步骤S207中,完成数据添加后,释放新建子容器的锁。
在步骤S208中,更新父容器的计数器值,以及同时记录所添加的数据在父容器中的序号,以便在如图4、图5或图6所述的数据操作时,及时找到待被操作的数据所处的子容器;例如,第一阈值为100,所添加的数据是父容器中的第202个数据,被添加至第三子容器。至此,完成新建子容器以向父容器添加更多数据的操作。
在步骤S202中,判断当前子容器中的数据量是否达到第一阈值,如果未到达第一阈值,则进行到步骤S209。
在步骤S209中,继续使用当前子容器来添加数据,因而请求当前子容器的锁。
在步骤S210中,尝试获得当前子容器的锁。如果未获得当前子容器的锁,则进行到步骤S211,循环尝试请求当前子容器的锁,直至获得当前子容器的锁;如果获得当前子容器的锁,则进行到步骤S212。
在步骤S212中,将数据添加到当前子容器中。
在步骤S213中,完成数据添加后,释放当前子容器的锁。
在步骤S214中,如在步骤208中同样的处理,更新父容器的计数器值并记录数据的序号。至此,完成使用当前子容器以向父容器添加更多数据的操作。
在本实施例中,组成父容器的多个子容器在内存上不重叠,即实现了物理隔离子容器,从而物理隔离数据。通过本实施例,通过增加子容器的方式,增加了线程抢夺到子容器的锁的机会,从而减小了CPU消耗。此外,由父容器对各个子容器进行管理。
图3是根据本发明实施例的父容器与子容器在内存中的关系的示意图。如图3所示,在内存中,父容器由多个子容器组成。通过子容器的方法size()可以获得每个子容器的数据量,因而父容器的计数器值指示了所有子容器的数据量之后。子容器中的列表表示该子容器中的数据的集合。例如,假设第一阈值为100,当创建父容器后,子容器1中的数据在父容器中的序号为1至100,子容器2中的数据在父容器中的序号为101至200,子容器3中的数据在父容器中的序号为201至300,等等。
下文中,将结合图4、图5、和图6所示的实施例,说明根据不同的数据操作方式需要获得的子容器的锁的数量是不同的。
图4是根据本发明实施例的对父容器中的数据进行操作的流程图。操作包括对父容器的任何子容器中的任何位置的数据进行添加、修改以及删除等等。在图4的实施例中,假设待被操作的数据存储于子容器2中。
在步骤S401中,线程尝试操作父容器中的数据。
在步骤S402中,根据待被操作的数据的序号以及各个子容器的数据量判断该数据存储于子容器2中。例如,假设第一阈值为50,即每个子容器中可存储50个数据,例如子容器1的数据序号为[1]~[100],子容器2中的数据序号为[101]~[200],子容器3中的数据序号为[201]~[299]等等。假设待被操作的数据在整个父容器中的序号为102,则可判定待被操作的数据存储于子容器2中。
为操作子容器2中的数据,线程需要获得子容器1和子容器2的锁,这是因为:如果该线程只获得子容器2的锁,此时如果另一线程正在删除子容器1中的数据,则可能导致存储在子容器2中的数据的序号发生变更,从而导致未能正确操作期望的数据。例如待被操作的数据的原序号为102,如果该线程未能获得子容器1的锁而只获得了子容器2的锁,并且如果同时另一线程正成功删除了处于子容器1中的、例如序号为51的数据,则该线程所期望操作的数据的序号被变更为101,但该线程可能误操作原序号为103、变更后序号为102的数据。
在步骤403中,线程尝试获得子容器1的锁。如果未获得子容器1的锁,则进行到步骤S404,循环尝试请求子容器1的锁,直至获得子容器1的锁;如果获得子容器1的锁,则进行到步骤S405。
在步骤S405中,线程尝试获得子容器2的锁。如果未获得子容器2的锁,则进行到步骤S406,循环尝试请求子容器2的锁,直至获得子容器2的锁;如果获得子容器2的锁,则进行到步骤S407。
在步骤S407中,线程对子容器2中的数据进行操作。
在步骤S408中,线程释放子容器2的锁。
在步骤S409中,线程释放子容器1的锁。
在步骤S410中,为确保父容器的计数器值准确反映所有子容器的数据量之和,更新父容器的计数器值以及数据在父容器中的序号。至此,完成根据本实施例的对父容器中的数据的操作。在本实施例中,为保证数据的一致性,如果待被修改或删除的数据存储于子容器x,则需获得子容器1至子容器x的锁,相应地,在操作完成之后,也应释放子容器1至子容器x的锁。
图5是根据本发明实施例的向父容器中最后一个子容器添加数据的流程图。在本实施例中,最后一个子容器是指其所存储的数据的序号为最大序号的子容器,例如图3中的子容器n。由于添加数据时,无论其他子容器中的数据是否变化,都不影响向最后一个子容器中添加数据,所以只需获得最后一个子容器的锁,即可实现向父容器添加数据。
在图5的实施例中,最后一个子容器为子容器n。在步骤S501中,线程尝试向父容器中的最后一个子容器添加数据,例如,假设第一阈值为100,当前父容器的计数器值为456,当待添加的数据的序号为457时,该数据将被添加至最后一个子容器。
在步骤S502中,线程尝试获得子容器n的锁。如果未获得子容器n的锁,则进行到步骤S503,循环尝试请求子容器n的锁,直至获得子容器n的锁;如果获得子容器1的锁,则进行到步骤S504。
在步骤S504中,线程向子容器n中添加数据。
在步骤S505中,线程释放子容器n的锁。
在步骤S506中,更新父容器的计数器值以及数据在父容器中的序号。至此,完成根据本实施例的向父容器中的最后一个子容器添加数据的操作。
图6是根据本发明实施例的向父容器中的子容器的起始位置添加数据的流程图。图6可被认为是图4的实施例的另一种情况。在向子容器中的任一位置添加数据后,不仅要更新数据在父容器中的序号,同时从子容器的角度看,也需维护数据在子容器中的序号,为对不同的序号做出区别,在本文中,将数据在父容器中的序号称为序号,将数据在子容器中的序号称为子序号。例如,第一阈值为100,数据的序号为251,子序号为51,则该数据存储于子容器3中的第三位置。当向子容器中的某个位置添加数据时,该容器中该位置之后的位置上的数据的子序号都将随之增加。也就是说,当向子容器中的起始位置添加数据时,该子容器中的数据的子序号都将随着增加,这可能导致处理性能下降。为了防止这种情况,在本实施例中,当向子容器中的起始位置添加数据时,将该数据添加至该子容器前一个子容器的末尾位置,即添加至其所存储的数据的序号比该数据的序号小1的子容器的末尾位置,以防止子容器中的数据的子序号全部增加。同时,为了防止子容器中的数据量超过第一阈值而导致内存溢出等问题,设置第二阈值,并且第二阈值大于第一阈值,在创建父容器时,每个子容器最多可存储第一阈值个数据,在完成父容器创建后,当向父容器中的子容器添加数据时,每个子容器最多可存储第二阈值个数据。也就是说,在创建父容器时,为每个子容器留有存储余量。在实践中,可根据应用场景设置第一阈值以及第二阈值。
具体地,在步骤S601中,线程尝试向父容器中的一个子容器中添加数据。
在步骤S602中,判断该数据应被添加至该子容器的初始位置,在本实施例中,假设第一阈值为100,该数据的序号为301,则该数据应被添加至子容器3的初始位置。
在步骤S603中,根据本实施,判断将该数据添加至子容器2的末尾位置。
因此在步骤S604中,该线程尝试获得子容器1的锁。如果未获得子容器1的锁,则进行到步骤S605,循环尝试请求子容器1的锁,直至获得子容器1的锁;如果获得子容器1的锁,则进行到步骤S606。
在步骤S606中,线程尝试获得子容器2的锁。如果未获得子容器2的锁,则进行到步骤S607,循环尝试请求子容器2的锁,直至获得子容器2的锁;如果获得子容器2的锁,则进行到步骤S608。
在步骤S608中,线程将数据添加至子容器2中的末尾位置,其中由于设置了第二阈值,子容器2的数据总量虽然可能大于第一阈值,但小于第二阈值,因此不会造成内存溢出等问题。
在步骤S609中,线程释放子容器2的锁。
在步骤S610中,线程释放子容器1的锁。
在步骤S611中,为确保父容器的计数器值准确反映所有子容器的数据量之和,更新父容器的计数器值以及数据在父容器中的序号。至此,完成根据本实施例的向父容器中的子容器的起始位置添加数据的操作。可选的,对于向子容器中的任一位置添加数据时,均可采用图6所示的流程,即,将该数据添加至该子容器前一个子容器的末尾位置,以防止由于数据的子序号随之增加而带来的处理性能下降。
图7是根据本发明实施例的实现并发容器的装置的示意图。该装置包括子容器创建模块、数据操作模块以及子容器管理模块。
在对父容器进行创建时:通过数据操作模块向所述父容器添加数据,并在数据操作模块中记录所添加的数据在所述父容器中的序号。当所添加的数据的量达到第一阈值时,数据操作模块通知子容器创建模块在内存中创建一个新的子容器。在初始添加时,父容器被视为第一子容器(子容器1),随着添加的数据量的增多,根据图2中所示步骤在内存中创建若干子容器,例如,第二子容器(子容器2)、第三子容器(子容器3)、……第n子容器(子容器n),直至所有数据被添加至父容器中为止,其中,每个子容器包含第一阈值数量的数据。此外,父容器通过子容器管理模块对各个子容器进行管理。
在完成对父容器的创建后,在一个线程对父容器中的数据进行操作时,数据操作模块根据待被操作的数据的序号以及子容器的数据量判断该数据存储于哪一个子容器中。随后,该线程获取待被操作的数据所处的子容器的锁,以及所存储的数据的序号小于所述数据的序号的子容器的锁。在该线程通过数据操作模块对该数据进行操作后,释放该数据所处的子容器的锁,以及所存储的数据的序号小于该数据所处的序号的子容器的锁,以允许其他线程进行操作。最后父容器通过数据操作模块更新计数器值以及数据的序号具体地,在本实施例中,为保证数据的一致性,如果数据操作模块判断待被操作的数据存储于子容器x,则该线程需获得子容器1至子容器x的锁,相应地,在操作完成之后,也应释放子容器1至子容器x的锁。
再例如,在完成对父容器的创建后,当一个线程向父容器中的最后一个子容器添加数据时,即当一个线程向父容器中其所存储的数据的序号为最大序号的子容器添加所述数据时,由于无论其他子容器中的数据是否变化,都不影响向最后一个子容器中添加数据,所以只需获得最后一个子容器的锁,即可实现向父容器中的最后一个子容器添加数据。具体地,该线程获取最后一个子容器的锁;通过数据操作模块向最后一个子容器添加数据,然后,该线程释放最后一个子容器的锁,以允许其他线程进行操作;最后父容器通过数据操作模块更新计数器值以及数据的序号。
再例如,在数据操作模块中设置第二阈值,其中,第二阈值大于第一阈值。在完成对父容器的创建后,当一个线程向父容器中的子容器的起始位置添加所述数据时,该线程通过数据操作模块将数据添加至在该子容器前一个子容器的末尾位置,即将数据添加至其所存储的数据的序号比该数据的序号小1的子容器的末尾位置,其中,该数据所添加至的子容器的数据量小于第二阈值。如图6所述,此时,该线程也应获得相应子容器的锁。
下面参考图8,其示出了适于用来实现本申请实施例的终端设备的计算机系统800的结构示意图。图8示出的终端设备仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图8所示,计算机系统800包括中央处理单元(CPU)801,其可以根据存储在只读存储器(ROM)802中的程序或者从存储部分808加载到随机访问存储器(RAM)803中的程序而执行各种适当的动作和处理。在RAM 803中,还存储有系统800操作所需的各种程序和数据。CPU 801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。
以下部件连接至I/O接口805:包括键盘、鼠标等的输入部分806;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分807;包括硬盘等的存储部分808;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分809。通信部分809经由诸如因特网的网络执行通信处理。驱动器810也根据需要连接至I/O接口805。可拆卸介质811,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器810上,以便于从其上读出的计算机程序根据需要被安装入存储部分808。
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分809从网络上被下载和安装,和/或从可拆卸介质811被安装。在该计算机程序被中央处理单元(CPU)801执行时,执行本申请的系统中限定的上述功能。
需要说明的是,本申请所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本申请实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括数据操作模块和子容器创建模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,数据操作模块还可以被描述为“根据外部指令等对数据进行操作的模块”。
作为另一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:向所述父容器中的一个子容器添加数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到第一阈值时,在内存中创建一个新的子容器;以及继续向所创建的新的子容器中添加所述数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到所述第一阈值时,在内存中再次创建另一新的子容器;以此类推,直至所有数据都被添加至所述父容器为止,其中所述子容器在内存中彼此物理隔离。
根据本发明实施例的技术方案,因为采用通过增加子容器的方式而在内存上物理隔离数据的技术手段,所以克服了由于轮询容器锁而引起的CPU消耗及性能降低的技术问题,并通过实现对并发容器的随机存取而增加并发容器的使用效率,进而达到降低对物理服务器的要求、减少服务器成本以及提高生产效率的技术效果。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (12)

1.一种实现并发容器的方法,其特征在于,所述并发容器是由多个子容器组成的父容器,按如下步骤对所述父容器进行创建:
向所述父容器中的一个子容器添加数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到第一阈值时,在内存中创建一个新的子容器;以及
继续向所创建的新的子容器中添加所述数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到所述第一阈值时,在内存中再次创建另一新的子容器;以此类推,直至所有数据都被添加至所述父容器为止,其中所述子容器在内存中彼此物理隔离;
在创建所述父容器后,当一个线程对所述父容器中的所述数据进行操作时,根据所述数据的序号以及所述子容器的数据量判断所述数据存储于哪一个所述子容器中;
所述线程获取所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁;
所述线程对所述数据进行操作,然后释放所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁,以允许其他线程进行操作;
所述父容器更新计数器值以及所述数据的序号。
2.根据权利要求1所述的方法,还包括:所述父容器对所述子容器进行管理。
3.根据权利要求1所述的方法,还包括:所述父容器中设有一个计数器,所述计数器的计数器值指示所有所述子容器的数据量之和。
4.根据权利要求3所述的方法,还包括:
在创建所述父容器后,当一个线程向所述父容器中其所存储的数据的序号为最大序号的子容器添加所述数据时,所述线程获取其所存储的数据的序号为最大序号的子容器的锁;
所述线程向其所存储的数据的序号为最大序号的子容器添加所述数据,然后释放其所存储的数据的序号为最大序号的子容器的锁,以允许其他线程进行操作;
所述父容器更新所述计数器值以及所述数据的序号。
5.根据权利要求3所述的方法,还包括:
设置第二阈值,所述第二阈值大于所述第一阈值;
在创建所述父容器后,当一个线程向所述父容器中的子容器的起始位置添加所述数据时,将所述数据添加至其所存储的数据的序号比所述数据的序号小1的子容器的末尾位置,其中,所述数据所添加至的子容器的数据量小于所述第二阈值。
6.一种实现并发容器的装置,其特征在于,所述并发容器是由多个子容器组成的父容器,所述装置包括数据操作模块和子容器创建模块,其中,在对所述父容器进行创建时:
所述数据操作模块向所述父容器中的一个子容器添加数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到第一阈值时,所述数据操作模块通知所述子容器创建模块在内存中创建一个新的子容器;
所述数据操作模块继续向所创建的新的子容器中添加所述数据,并记录所添加的数据在所述父容器中的序号,当所添加的数据的量达到所述第一阈值时,所述数据操作模块通知所述子容器创建模块在内存中再次创建另一新的子容器,以此类推,直至所有数据都被添加至所述父容器为止,其中所述子容器在内存中彼此物理隔离;
在创建所述父容器后,当一个线程对所述父容器中的所述数据进行操作时,所述数据操作模块根据所述数据的序号以及所述子容器的数据量判断所述数据存储于哪一个所述子容器中;
所述线程获取所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁;
所述线程通过所述数据操作模块对所述数据进行操作,然后释放所述数据所处的子容器的锁,以及其所存储的数据的序号小于所述数据的序号的子容器的锁,以允许其他线程进行操作;
所述父容器通过所述数据操作模块更新计数器值以及所述数据的序号。
7.根据权利要求6所述的装置,还包括子容器管理模块:所述父容器通过所述子容器管理模块对所述子容器进行管理。
8.根据权利要求6所述的装置,还包括:所述父容器中设有一个计数器,所述计数器的计数器值指示所有所述子容器的数据量之和。
9.根据权利要求8所述的装置,还包括:
在创建所述父容器后,当一个线程向所述父容器中其所存储的数据的序号为最大序号的子容器添加所述数据时,所述线程获取其所存储的数据的序号为最大序号的子容器的锁;
所述线程通过所述数据操作模块向其所存储的数据的序号为最大序号的子容器添加所述数据,然后释放其所存储的数据的序号为最大序号的子容器的锁,以允许其他线程进行操作;
所述父容器通过所述数据操作模块更新所述计数器值以及所述数据的序号。
10.根据权利要求8所述的装置,还包括:
在数据操作模块中设置第二阈值,所述第二阈值大于所述第一阈值;
在创建所述父容器后,当一个线程向所述父容器中的子容器的起始位置添加所述数据时,通过所述数据操作模块将所述数据添加至其所存储的数据的序号比所述数据的序号小1的子容器的末尾位置,其中,所述数据所添加至的子容器的数据量小于所述第二阈值。
11.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-5中任一所述的方法。
12.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-5中任一所述的方法。
CN201710261006.8A 2017-04-20 2017-04-20 一种实现并发容器的方法和装置 Active CN108733361B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710261006.8A CN108733361B (zh) 2017-04-20 2017-04-20 一种实现并发容器的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710261006.8A CN108733361B (zh) 2017-04-20 2017-04-20 一种实现并发容器的方法和装置

Publications (2)

Publication Number Publication Date
CN108733361A CN108733361A (zh) 2018-11-02
CN108733361B true CN108733361B (zh) 2022-03-04

Family

ID=63933468

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710261006.8A Active CN108733361B (zh) 2017-04-20 2017-04-20 一种实现并发容器的方法和装置

Country Status (1)

Country Link
CN (1) CN108733361B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111290754B (zh) * 2020-01-23 2023-02-24 湖南快乐阳光互动娱乐传媒有限公司 组件渲染方法及装置
CN113312613A (zh) * 2020-05-15 2021-08-27 阿里巴巴集团控股有限公司 容器创建方法、容器删除方法、装置及设备

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103608785A (zh) * 2013-06-21 2014-02-26 华为技术有限公司 一种文件读取方法、存储设备及读取系统
CN106503051A (zh) * 2016-09-23 2017-03-15 暨南大学 一种基于元数据分类的贪婪预取型数据恢复系统及恢复方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8327288B1 (en) * 2009-08-20 2012-12-04 Adobe Systems Incorporated Systems and methods for facilitating the display and use of displayed objects in content creation environments
US9652612B2 (en) * 2015-03-25 2017-05-16 International Business Machines Corporation Security within a software-defined infrastructure

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103608785A (zh) * 2013-06-21 2014-02-26 华为技术有限公司 一种文件读取方法、存储设备及读取系统
CN106503051A (zh) * 2016-09-23 2017-03-15 暨南大学 一种基于元数据分类的贪婪预取型数据恢复系统及恢复方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量;xiexie;《cnblogs :https://www.cnblogs.com/xiezie/p/5511840.html》;20160520;网页正文第1-2页 *
java CopyOnWriteArrayList;weixin_30367945;《CSDN,https://blog.csdn.net/weixin_30367945/article/details/97887976》;20141218;网页正文 *
java多线程—ConcurrentHashMap锁分段机制;weixin_34038652;《CSDN》;20170328;网页正文 *

Also Published As

Publication number Publication date
CN108733361A (zh) 2018-11-02

Similar Documents

Publication Publication Date Title
CN107395665B (zh) 一种区块链业务受理及业务共识方法及装置
CN109032796B (zh) 一种数据处理方法和装置
US10162644B2 (en) Shielding real-time workloads from OS jitter due to expedited grace periods
US10922134B2 (en) Method, device and computer program product for processing data
US11269692B2 (en) Efficient sequencer for multiple concurrently-executing threads of execution
EP3860043A2 (en) Method and apparatus for implementing smart contract based on blockchain
CN110928912A (zh) 一种生成唯一标识的方法和装置
CN110162344B (zh) 一种隔离限流的方法、装置、计算机设备及可读存储介质
CN108733361B (zh) 一种实现并发容器的方法和装置
US20220413906A1 (en) Method, device, and program product for managing multiple computing tasks based on batch
CN112241398A (zh) 一种数据迁移方法和系统
CN112529711B (zh) 基于区块链虚拟机复用的交易处理方法及装置
CN112000670B (zh) 一种多线程程序数据统一管理方法、系统及电子设备
CN107885543B (zh) 一种应用程序的功能管理方法、装置和智能终端
CN111290842A (zh) 一种任务执行方法和装置
CN116226151A (zh) 一种数据存储、读取和删除的方法和装置
EP4068094A1 (en) Lock-free ring buffer
CN113254464B (zh) 一种数据加载方法和装置
CN113760524A (zh) 任务执行方法和装置
CN114595047A (zh) 一种批量任务处理方法和装置
CN113778910A (zh) 一种数据缓存的处理方法及装置
CN108874560B (zh) 进行通信的方法和通信设备
CN112182003A (zh) 一种数据同步方法和装置
CN109983435B (zh) 图形处理方法及相关装置和设备
CN112579615A (zh) 一种实现分布式锁的方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant