本申請涉及計算機領域,具體而言,涉及一種在數據集合中添加元素的方法和裝置。
背景技術:
在手機、計算機等設備的系統(tǒng)中經常需要使用數據集合,包括添加、刪除元素、枚舉集合項等操作。在高并發(fā)環(huán)境下使用數據集合(以下簡稱集合)進行元素添加等操作時容易出現并發(fā)問題。例如某個共享集合內有三個元素,假設為1、2、3,依次枚舉集合中每一項,如果不是并發(fā)訪問的話,則依次返回1、2、3。但是在并發(fā)訪問時,假設依次枚舉1、2,此時另外一個線程在上述共享集合中添加了1個元素4,并且將4添加至2和3之間,那么獲取第三個元素的時候就是4,從而獲取到的整個集合元素為1、2、4,這時獲取到的集合元素顯然是錯誤的。
針對上面提到的并發(fā)問題,常見的解決方案是加鎖,也就是在訪問共享集合前,先鎖定整個共享集合,其他線程要向共享集合添加元素的話,必須先等待鎖釋放。但是這樣會影響程序性能,尤其是在高并發(fā)環(huán)境下,大量使用鎖,會導致很多線程等待,甚至死鎖情況出現。
針對上述的問題,目前尚未提出有效的解決方案。
技術實現要素:
本申請實施例提供了一種在數據集合中添加元素的方法和裝置,以至少解決現有技術在高并發(fā)環(huán)境下向數據集合添加元素前,需要對其進行加鎖操作導致應用該數據集合的程序出現死鎖情況的技術問題。
根據本申請實施例的一個方面,提供了一種在數據集合中添加元素的方法,包括:創(chuàng)建被共享給多個線程的第一數據集合;將所述第一數據集合中的元素列表復制為本地副本,得到第二數據集合;向所述第二數據集合添加待添加元素,得到第三數據集合,其中,所述第一數據集合、所述第二數據集合和所述第三數據集合均為不可變集合;以及將所述第一數據集合替換為所述第三數據集合,并返回第一添加結果。
進一步地,在向所述第二數據集合添加待添加元素,得到第三數據集合之后,所述方法還包括:判斷所述第三數據集合與所述第二數據集合是否相同,其中,在判斷出所述第三數據集合與所述第二數據集合不相同的情況下,將所述第一數據集合替換為所述第三數據集合,并返回所述第一添加結果。
進一步地,在判斷所述第三數據集合與所述第二數據集合是否相同之后,所述方法還包括:在判斷出所述第三數據集合與所述第二數據集合不相同的情況下,判斷所述第一數據集合和所述第二數據集合是否相同,其中,在判斷出所述第一數據集合和所述第二數據集合相同的情況下,將所述第一數據集合替換為所述第三數據集合,并返回所述第一添加結果。
進一步地,在判斷所述第三數據集合與所述第二數據集合是否相同之后,所述方法還包括:在判斷出所述第三數據集合與所述第二數據集合相同的情況下,返回第二添加結果,其中,所述第一添加結果和所述第二添加結果不相同。
進一步地,向所述第二數據集合添加待添加元素,得到第三數據集合包括:獲取所述待添加元素;判斷所述待添加元素的數量是等于一還是大于一;在判斷出所述待添加元素的數量等于一的情況下,向所述第二數據集合添加所述待添加元素,得到第三數據集合;在判斷出所述待添加元素的數量大于一的情況下,將所述本地副本轉換為目標數據集合,其中,所述目標數據集合為可變集合;添加多個所述待添加元素至所述目標數據集合,并將所述目標數據集合轉換為所述第三數據集合。
進一步地,添加多個所述待添加元素至所述目標數據集合包括:判斷待添加元素Ai在所述目標數據集合中是否存在,其中,i依次取1至n,n為所述待添加元素的數量,且n大于或者等于2;在判斷出所述待添加元素Ai在所述目標數據集合中存在的情況下,不添加所述待添加元素Ai至所述目標數據集合;在判斷出所述待添加元素Ai在所述目標數據集合中不存在的情況下,添加所述待添加元素Ai至所述目標數據集合。
根據本申請實施例的另一方面,還提供了一種在數據集合中添加元素的裝置,包括:創(chuàng)建單元,用于創(chuàng)建被共享給多個線程的第一數據集合;復制單元,用于將所述第一數據集合中的元素列表復制為本地副本,得到第二數據集合;添加單元,用于向所述第二數據集合添加待添加元素,得到第三數據集合,其中,所述第一數據集合、所述第二數據集合和所述第三數據集合均為不可變集合;以及替換單元,用于將所述第一數據集合替換為所述第三數據集合,并返回第一添加結果。
進一步地,所述裝置還包括:第一判斷單元,用于在向所述第二數據集合添加待 添加元素,得到第三數據集合之后,判斷所述第三數據集合與所述第二數據集合是否相同,其中,在判斷出所述第三數據集合與所述第二數據集合不相同的情況下,將所述第一數據集合替換為所述第三數據集合,并返回所述第一添加結果。
進一步地,所述裝置還包括:第二判斷單元,用于在判斷所述第三數據集合與所述第二數據集合是否相同之后,在判斷出所述第三數據集合與所述第二數據集合不相同的情況下,判斷所述第一數據集合和所述第二數據集合是否相同,其中,在判斷出所述第一數據集合和所述第二數據集合相同的情況下,將所述第一數據集合替換為所述第三數據集合,并返回所述第一添加結果。
進一步地,所述裝置還包括:返回單元,用于在判斷所述第三數據集合與所述第二數據集合是否相同之后,在判斷出所述第三數據集合與所述第二數據集合相同的情況下,返回第二添加結果,其中,所述第一添加結果和所述第二添加結果不相同。
進一步地,所述添加單元包括:獲取模塊,用于獲取所述待添加元素;判斷模塊,用于判斷所述待添加元素的數量是等于一還是大于一;第一添加模塊,用于在判斷出所述待添加元素的數量等于一的情況下,向所述第二數據集合添加所述待添加元素,得到第三數據集合;轉換模塊,用于在判斷出所述待添加元素的數量大于一的情況下,將所述本地副本轉換為目標數據集合,其中,所述目標數據集合為可變集合;第二添加模塊,用于添加多個所述待添加元素至所述目標數據集合,并將所述目標數據集合轉換為所述第三數據集合。
進一步地,所述第二添加模塊包括:判斷子模塊,用于判斷待添加元素Ai在所述目標數據集合中是否存在,其中,i依次取1至n,n為所述待添加元素的數量,且n大于或者等于2;第一處理子模塊,用于在判斷出所述待添加元素Ai在所述目標數據集合中存在的情況下,不添加所述待添加元素Ai至所述目標數據集合;第二處理子模塊,用于在判斷出所述待添加元素Ai在所述目標數據集合中不存在的情況下,添加所述待添加元素Ai至所述目標數據集合。
在本申請實施例中,采用創(chuàng)建被共享給多個線程的第一數據集合;將所述第一數據集合中的元素列表復制為本地副本,得到第二數據集合;向所述第二數據集合添加待添加元素,得到第三數據集合,其中,所述第一數據集合、所述第二數據集合和所述第三數據集合均為不可變集合;以及將所述第一數據集合替換為所述第三數據集合,并返回第一添加結果。通過將在高并發(fā)環(huán)境下共享給多個線程的第一數據集合創(chuàng)建為不可變集合,進而將上述第一數據集合保存為本地副本,以得到第二數據集合,再向第二數據集合中添加元素以得到包含了添加的元素的第三數據集合,最后將最初創(chuàng)建的不可變集合(也即第一數據集合)與添加元素后的不可變集合(即,第三數據集合) 進行替換,達到了在高并發(fā)環(huán)境下,向數據集合添加元素前無需對該數據集合進行加鎖操作的目的,從而解決了現有技術在高并發(fā)環(huán)境下向數據集合添加元素前,需要對其進行加鎖操作導致應用該數據集合的程序出現死鎖情況的技術問題,達到了提高應用該數據集合的程序的工作穩(wěn)定性的技術效果。
附圖說明
此處所說明的附圖用來提供對本申請的進一步理解,構成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構成對本申請的不當限定。在附圖中:
圖1是根據本申請實施例的一種在數據集合中添加元素的方法的流程圖;
圖2是根據本申請實施例的一種可選的在數據集合中添加元素的方法的流程圖;以及
圖3是根據本申請實施例的一種在數據集合中添加元素的裝置的示意圖。
具體實施方式
為了使本技術領域的人員更好地理解本申請方案,下面將結合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分的實施例,而不是全部的實施例?;诒旧暾堉械膶嵤├?,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應當屬于本申請保護的范圍。
需要說明的是,本申請的說明書和權利要求書及上述附圖中的術語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應該理解這樣使用的數據在適當情況下可以互換,以便這里描述的本申請的實施例能夠以除了在這里圖示或描述的那些以外的順序實施。此外,術語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產品或設備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或對于這些過程、方法、產品或設備固有的其它步驟或單元。
首先,在對本申請實施例進行描述的過程中出現的部分名詞或術語適用于解釋如下:
不可變集合:是指在修改集合(例如,向集合添加元素或者刪除集合內的元素)時,該集合不會發(fā)生變化,而是生成一個新的集合。比如,當向某個不可變集合添加 元素時,該集合不會變化,而是返回一個新集合,新集合中包含原集合(即,上文中的該集合)的元素和新添加元素。
根據本申請實施例,提供了一種在數據集合中添加元素的方法,該方法可以應用于高并發(fā)環(huán)境。圖1是根據本申請實施例的一種在數據集合中添加元素的方法的流程圖,如圖1所示,該方法包括如下步驟:
步驟S102,創(chuàng)建被共享給多個線程的第一數據集合。
具體地,第一數據集合中包括用于存儲元素的元素列表,其中,元素的數量可以為一個,也可以為多個。
例如,步驟S102中創(chuàng)建了一個第一數據集合,該第一數據集合的元素列表中存儲有3個元素,分別為a、b和c。
步驟S104,將第一數據集合中的元素列表復制為本地副本,得到第二數據集合。
繼續(xù)采用上述舉例進行說明,將步驟S102中創(chuàng)建的第一數據集合的元素列表復制為本地副本,則得到第二數據集合,其中,第二數據集合中的元素與第一數據集合中的元素相同,也即,第二數據集合中也包含3個元素,分別為a、b和c。
步驟S106,向第二數據集合添加待添加元素,得到第三數據集合。
具體地,上述第一數據集合、第二數據集合和第三數據集合均為不可變集合。根據前面對不可變集合的解釋說明可知,使用不可變集合的好處是支持高并發(fā),因為集合是不可變的,所以在高并發(fā)的環(huán)境下,即使有多個線程對該數據集合進行修改(例如,添加元素)時也無需對上述數據集合進行加鎖操作。
由于第二數據集合是不可變集合,所以向第二數據集合添加元素時,會返回(得到)一個新的數據集合(也即,步驟S106中的第三數據集合)。例如,添加元素d至第二數據集合,則會得到新的數據集合(即,第三數據集合),該新的數據集合中包含4個元素,分別是a、b、c和d。
步驟S108,將第一數據集合替換為第三數據集合,并返回第一添加結果。
具體地,第一添加結果可以為true,表明添加成功。
將第一數據集合替換為第三數據集合后,會將第三數據集合作為新的第一數據集合仍舊共享給多個線程,根據上述舉例可知,此時新的第一數據集合中(也即替換了第一數據集合的第三數據集合)包含的元素為a、b、c和d。
需要說明的是,由于第三數據集合也是不可變集合,因此將第一數據集合替換為 包含了新添加元素的第三數據集合后,若向第三數據集合添加元素,無需對第三數據集合進行加鎖操作。
在本申請實施例中,通過將在高并發(fā)環(huán)境下共享給多個線程的第一數據集合創(chuàng)建為不可變集合,進而通過將上述第一數據集合中存儲元素的元素列表保存為本地副本來得到第二數據集合,再向第二數據集合中添加元素即可得到包含了新添加的元素的第三數據集合,最后將最初創(chuàng)建的不可變集合(也即第一數據集合)與添加新元素后的不可變集合(即,第三數據集合)進行替換,達到了在高并發(fā)環(huán)境下,向數據集合添加元素前無需對該數據集合進行加鎖操作的目的,從而解決了現有技術在高并發(fā)環(huán)境下向數據集合添加元素前,需要對其進行加鎖操作導致應用該數據集合的程序出現死鎖情況的技術問題,達到了提高應用該數據集合的程序的工作穩(wěn)定性的技術效果。
可選地,在本申請實施例中,在向第二數據集合添加待添加元素,得到第三數據集合之后,方法還包括步驟S1,具體如下:
步驟S1,判斷第三數據集合與第二數據集合是否相同,其中,在判斷出第三數據集合與第二數據集合不相同的情況下,將第一數據集合替換為第三數據集合,并返回第一添加結果。
具體地,待添加元素可以為一個,也可以為多個。向第二數據集合添加待添加元素時,如果某個待添加元素在第二數據集合中已經存在,則不向第二數據集合添加上述已經存在的待添加元素,也即,只向添加第二數據集合中添加其內不存在的待添加元素,但是不論是否成功添加元素至第二數據集合,根據不可變集合的特點,都會返回(得到)一個新的數據集合,即第三數據集合。
基于上述說明,對于待添加元素為一個的情況,如果上述一個待添加元素在第二數據集合內已存在,則得到的第三數據集合與第二數據集合相同;如果上述一個待添加元素在第二數據集合內不存在,則得到的第三數據集合與第二數據集合不同。對于待添加元素為多個的情況,如果上述多個待添加元素在第二數據集合內均已存在,則得到的第三數據集合與第二數據集合相同;如果多個待添加元素中有至少一個待添加元素在第二數據集合中不存在,則得到的第三數據集合與第二數據集合不同,并且得到的第三數據集合中包含第二數據集合中的元素以及后添加的元素。
在本申請實施例中,通過將添加元素后的不可變集合與未添加元素前的不可變集合進行對比,在確定了添加元素后的不可變集合成功添加元素后才將最初被共享給多個線程的不可變集合替換為上述成功添加元素后的不可變集合。
需要說明的是,上述添加元素后的不可變集合是指執(zhí)行了添加元素操作的不可變 集合,但執(zhí)行了添加元素操作,并不代表就能成功的將元素添加至不可變集合。
可選地,在本申請實施例中,在判斷第三數據集合與第二數據集合是否相同之后,方法還包括步驟S3,具體如下:
步驟S3,在判斷出第三數據集合與第二數據集合不相同的情況下,判斷第一數據集合和第二數據集合是否相同,其中,在判斷出第一數據集合和第二數據集合相同的情況下,將第一數據集合替換為第三數據集合,并返回第一添加結果。
具體地,為了保證某個線程的用戶能夠有效的向第一數據集合中添加元素,在判斷出第三數據集合與第二數據集合不同后,還需判斷第一數據集合與第二數據集合是否相同,也即,判斷第一數據集合與第二數據集合相比是否發(fā)生變化,若判斷出第一數據集合與第二數據集合相同,也即,判斷出第一數據集合與第二數據集合相比未發(fā)生變化,說明在該線程的用戶添加元素至第一數據集合的過程中,沒有其它線程的用戶對第一數據集合進行修改,則將第一數據集合替換為第三數據集合;若判斷出第一數據集合與第二數據集合不相同,也即,判斷出第一數據集合與第二數據集合相比發(fā)生了變化,說明在該線程的用戶添加元素至第一數據集合的過程中,其它線程的用戶對第一數據集合進行了修改,那么需要獲取元素發(fā)生變化后的第一數據集合,并且對上述元素發(fā)生變化后的第一數據集合重復執(zhí)行步驟S104至步驟S108,以完成向元素發(fā)生變化后的第一數據集合添加元素。
可選地,在本申請實施例中,在判斷第三數據集合與第二數據集合是否相同之后,方法還包括:在判斷出第三數據集合與第二數據集合相同的情況下,返回第二添加結果,其中,第一添加結果和第二添加結果不相同。
具體地,第二添加結果可以為false,表明添加失敗。
在本申請實施例中,通過反饋添加結果,使得用戶能夠較為直觀的了解向被共享的數據集合添加元素是否成功,達到了提高用戶滿意度的效果。
繼續(xù)采用上述舉例進行說明,如果待添加元素為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,創(chuàng)建被共享給多個線程的第一數據集合,該步驟同步驟S102,在此不 再說明。
同樣的,第一數據集合為不可變集合,并且其內包含存儲元素的元素列表。
步驟S204,將第一數據集合中的元素列表復制為本地副本,得到第二數據集合,該步驟同步驟S104,在此不再說明。
步驟S206,判斷待添加元素是一個還是多個。其中,在待添加元素為一個的情況下,執(zhí)行步驟S222至步驟S230;在判斷出待添加元素為多個的情況下,執(zhí)行步驟S208至步驟S220。
步驟S208,將本地副本轉換為可變集合,得到目標數據集合。具體地,目標數據集合為可變集合。
步驟S210,向目標數據集合添加待添加元素。具體地,如果某個待添加元素在目標數據集合中已經存在,則不添加;如果某個待添加元素在目標數據集合中不存在,則添加,也即,只向目標數據集合添加該目標數據集合內不存在的元素。
需要說明的是,由于目標數據集合為可變集合,所以可以直接將待添加元素添加至目標數據集合,并且不會返回新的數據集合。
步驟S212,將添加元素后的目標數據集合進行轉換,得到第三數據集合。
具體地,將將添加元素后的目標數據集合轉換為不可變集合,上述不可變集合即為第三數據集合。
步驟S214,判斷第三數據集合和第二數據集合是否相同。該步驟同步驟S1,在此不再贅述。其中,在判斷出第三數據集合和第二數據集合不同的情況下,執(zhí)行步驟S216;在判斷出第三數據集合和第二數據集合相同的情況下,執(zhí)行步驟S218。
步驟S216,獲取第一數據集合,并判斷獲取到的第一數據集合與第二數據集合是否相同,該步驟同步驟S3,在此不再重復說明。其中,在判斷出第一數據集合和第二數據集合不同的情況下,返回步驟S204;在判斷出第一數據集合和第二數據集合相同的情況下,執(zhí)行步驟S220。
步驟S218,返回第二添加結果。具體地,第二添加結果可以為false,表明添加失敗。
步驟S220,將第一數據集合替換為第三數據集合,并返回第一添加結果。該步驟相當于步驟S108,在此不再贅述。
步驟S222,添加元素至第二數據集合,得到第三數據集合,該步驟相當于步驟S106, 在此不再贅述。
步驟S224,判斷第三數據集合與第二數據集合是否相同,該步驟同步驟S1,在此不再贅述。其中,在判斷出第三數據集合和第二數據集合不同的情況下,執(zhí)行步驟S226;在判斷出第三數據集合和第二數據集合相同的情況下,執(zhí)行步驟S228。
步驟S226,獲取第一數據集合,并判斷獲取到的第一數據集合與第二數據集合是否相同,該步驟同步驟S3,在此不再重復說明。其中,在判斷出第一數據集合和第二數據集合不同的情況下,返回步驟S204;在判斷出第一數據集合和第二數據集合相同的情況下,執(zhí)行步驟S230。
步驟S228,返回第二添加結果。具體地,第二添加結果可以為false,表明添加成功。
步驟S230,將第一數據集合替換為第三數據集合,并返回第一添加結果,該步驟相當于步驟S108,在此不再贅述。
在本申請實施例中,通過將在高并發(fā)環(huán)境下共享給多個線程的數據集合創(chuàng)建為不可變集合,這樣不論有多少個線程同時對該數據集合進行修改,都不是直接對該數據集合修改,而是返回一個新的數據集合,從而無需在向該數據集合添加元素前對其進行加鎖操作,進而保證了在向該數據集合添加元素時不影響其它線程對該集合的使用。
根據本申請實施例,還提供了一種在數據集合中添加元素的裝置,該裝置也可以應用于高并發(fā)環(huán)境,該在數據集合中添加元素的裝置用于執(zhí)行本申請實施例上述內容所提供的在數據集合中添加元素的方法,以下對本申請實施例所提供的在數據集合中添加元素的裝置做具體介紹:
圖3是根據本申請實施例的一種在數據集合中添加元素的裝置的示意圖,如圖3所示,該控制裝置主要包括創(chuàng)建單元31、復制單元33、添加單元35和替換單元37,其中:
創(chuàng)建單元31用于創(chuàng)建被共享給多個線程的第一數據集合。
例如,創(chuàng)建單元31中創(chuàng)建了一個第一數據集合,該第一數據集合的元素列表中存儲有3個元素,分別為a、b和c。
復制單元33用于將第一數據集合中的元素列表復制為本地副本,得到第二數據集合。
繼續(xù)采用上述舉例進行說明,將創(chuàng)建單元31中創(chuàng)建的第一數據集合的元素列表復 制為本地副本,則得到第二數據集合,其中,第二數據集合中的元素與第一數據集合中的元素相同,也即,第二數據集合中也包含3個元素,分別為a、b和c。
添加單元35用于向第二數據集合添加待添加元素,得到第三數據集合,其中,第一數據集合、第二數據集合和第三數據集合均為不可變集合。
具體地,上述第一數據集合、第二數據集合和第三數據集合均為不可變集合。根據前面對不可變集合的解釋說明可知,使用不可變集合的好處是支持高并發(fā),因為集合是不可變的,所以在高并發(fā)的環(huán)境下,即使有多個線程對該集合進行修改(例如,添加元素)時也無需對上述數據集合進行加鎖操作。
由于第二數據集合是不可變集合,所以向第二數據集合添加元素時,會返回(得到)一個新的數據集合(也即,添加單元35中的第三數據集合)。例如,添加元素d至第二數據集合,則會得到新的數據集合(即,第三數據集合),該新的數據集合中包含4個元素,分別是a、b、c和d。
替換單元37用于將第一數據集合替換為第三數據集合,并返回第一添加結果。
將第一數據集合替換為第三數據集合后,會將第三數據集合作為新的第一數據集合仍舊共享給多個線程,根據上述舉例可知,此時新的第一數據集合中(也即替換了第一數據集合的第三數據集合)包含的元素為a、b、c和d。
需要說明的是,由于第三數據集合也是不可變集合,因此將第一數據集合替換為包含了新添加元素的第三數據集合后,若向第三數據集合添加元素,同樣對第三數據集合進行加鎖操作。
在本申請實施例中,通過將在高并發(fā)環(huán)境下共享給多個線程的第一數據集合創(chuàng)建為不可變集合,進而通過將上述第一數據集合中存儲元素的元素列表保存為本地副本來以得到第二數據集合,再向第二數據集合中添加元素即可得到包含了新添加的元素的第三數據集合,最后將最初創(chuàng)建的不可變集合(也即第一數據集合)與添加新元素后的不可變集合(即,第三數據集合)進行替換,達到了在高并發(fā)環(huán)境下,向數據集合添加元素前無需對該數據集合進行加鎖操作的目的,從而解決了現有技術在高并發(fā)環(huán)境下向數據集合添加元素前,需要對其進行加鎖操作導致應用該數據集合的程序出現死鎖情況的技術問題,達到了提高應用該數據集合的程序的工作穩(wěn)定性的技術效果。
可選地,在本申請實施例中,裝置還包括第一判斷單元。其中,第一判斷單元用于在向第二數據集合添加待添加元素,得到第三數據集合之后,判斷第三數據集合與第二數據集合是否相同,其中,在判斷出第三數據集合與第二數據集合不相同的情況下,將第一數據集合替換為第三數據集合,并返回第一添加結果。
在本申請實施例中,通過將添加元素后的不可變集合與未添加元素前的不可變集合進行對比,在確定了添加元素后的不可變集合成功添加元素后才將最初被共享給多個線程的不可變集合替換為上述成功添加元素后的不可變集合。
需要說明的是,上述添加元素后的不可變集合是指執(zhí)行了添加元素操作的不可變集合,但執(zhí)行了添加元素操作,并不代表就能成功的將元素添加至不可變集合。
可選地,在本申請實施例中,裝置還包括第二判斷單元。其中,第二判斷單元用于在判斷第三數據集合與第二數據集合是否相同之后,在判斷出第三數據集合與第二數據集合不相同的情況下,判斷第一數據集合和第二數據集合是否相同,其中,在判斷出第一數據集合和第二數據集合相同的情況下,將第一數據集合替換為第三數據集合,并返回第一添加結果。
具體地,為了保證某個線程的用戶能夠有效的向第一數據集合中添加元素,在判斷出第三數據集合與第二數據集合不同后,還需判斷第一數據集合與第二數據集合是否相同,也即,判斷第一數據集合與第二數據集合相比是否發(fā)生變化,若判斷出第一數據集合與第二數據集合相同,也即,判斷出第一數據集合與第二數據集合相比未發(fā)生變化,說明在該線程的用戶添加元素至第一數據集合的過程中,沒有其它線程的用戶對第一數據集合進行修改,則將第一數據集合替換為第三數據集合;若判斷出第一數據集合與第二數據集合不相同,也即,判斷出第一數據集合與第二數據集合相比發(fā)生了變化,說明在該線程的用戶添加元素至第一數據集合的過程中,其它線程的用戶對第一數據集合進行了修改,那么需要獲取元素發(fā)生變化后的第一數據集合,并且對上述元素發(fā)生變化后的第一數據集合重復調用復制單元33、添加單元35和替換單元37,以完成向元素發(fā)生變化后的第一數據集合添加元素。
可選地,在本申請實施例中,裝置還包括:返回單元,用于在判斷第三數據集合與第二數據集合是否相同之后,在判斷出第三數據集合與第二數據集合相同的情況下,返回第二添加結果,其中,第一添加結果和第二添加結果不相同。
在本申請實施例中,通過反饋添加結果,使得用戶能夠較為直觀的了解向被共享的數據集合添加元素是否成功,達到了提高用戶滿意度的效果。
繼續(xù)采用上述舉例進行說明,如果待添加元素為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。再將目標數據集合轉換為不可變集合,也即得到第三數據集合。
所述在數據集合中添加元素的裝置包括處理器和存儲器,上述創(chuàng)建單元、復制單元、添加單元和替換單元等均作為程序單元存儲在存儲器中,由處理器執(zhí)行存儲在存儲器中的上述程序單元。
處理器中包含內核,由內核去存儲器中調取相應的程序單元。內核可以設置一個或以上,通過調整內核參數提高了應用數據集合的程序的工作穩(wěn)定性,解決了現有技術在高并發(fā)環(huán)境下向數據集合添加元素前,需要對其進行加鎖操作導致應用該數據集合的程序出現死鎖情況的技術問題。
存儲器可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內存等形式,如只讀存儲器(ROM)或閃存(flash RAM),存儲器包括至少一個存儲芯片。
本申請還提供了一種計算機程序產品的實施例,當在數據處理設備上執(zhí)行時,適于執(zhí)行初始化有如下方法步驟的程序代碼:創(chuàng)建被共享給多個線程的第一數據集合;將第一數據集合中的元素列表復制為本地副本,得到第二數據集合;向第二數據集合添加待添加元素,得到第三數據集合;以及將第一數據集合替換為第三數據集合,并返回第一添加結果。
上述本申請實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
在本申請的上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關描述。
在本申請所提供的幾個實施例中,應該理解到,所揭露的技術內容,可通過其它的方式實現。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個單元上??梢愿鶕嶋H的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。
另外,在本申請各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現,也可以采用軟件功能單元的形式實現。
所述集成的單元如果以軟件功能單元的形式實現并作為獨立的產品銷售或使用時,可以存儲在一個計算機可讀取存儲介質中?;谶@樣的理解,本申請的技術方案本質上或者說對現有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟件產品的形式體現出來,該計算機軟件產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可為個人計算機、服務器或者網絡設備等)執(zhí)行本申請各個實施例所述方法的全部或部分步驟。而前述的存儲介質包括:U盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質。
以上所述僅是本申請的優(yōu)選實施方式,應當指出,對于本技術領域的普通技術人員來說,在不脫離本申請原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本申請的保護范圍。