Java容器的同步化方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明設(shè)及JAVA技術(shù)領(lǐng)域,更為具體地,設(shè)及一種JAVA容器的同步化方法及系統(tǒng)。
【背景技術(shù)】
[0002] 傳統(tǒng)的JAVA迭代器下簡稱迭代器)屬于快速失敗類的迭代器,其迭代行為是非 線程安全的,因此,在迭代器迭代的過程中,當因業(yè)務(wù)需求動態(tài)地增加或刪除迭代對象時, 迭代器本身的行為將變的不可控,迭代行為向哪種方向發(fā)展取決于JAVA容器實現(xiàn)類的具體 算法,從而存在W下問題:
[0003] 1、在迭代器增加迭代對象時,有序序列的JAVA容器將在與迭代器的對應(yīng)順序位置 增加迭代對象,無序序列的JAVA容器將在隨機位置增加迭代對象,無論哪種序列,都無法獲 知運個位置是否被遍歷過。
[0004] 2、在迭代器刪除當前迭代對象時,有序序列的JAVA容器會將后序的迭代對象依次 前提一個位置,而無序序列的JAVA容器在刪除迭代對象后,后序的迭代對象的順序有可能 會被打亂,無論哪種序列,都會導(dǎo)致后序的迭代對象重新進行排序。
【發(fā)明內(nèi)容】
[0005] 鑒于上述問題,本發(fā)明的目的是提供一種JAVA容器的同步化方法及系統(tǒng),W解決 上述【背景技術(shù)】中指出的問題。
[0006] 本發(fā)明提供一種JAVA容器的同步化方法,包括:
[0007] 查看JAVA容器的類型;
[000引在JAVA容器為Collection類型時,對Collection類型的JAVA容器進行線程封裝, 使Collection類型的JAVA容器中的集合轉(zhuǎn)換成同步化集合;
[0009] 在JAVA容器為非Collection類型時,將非Collection類型的JAVA容器中的集合迭 代到預(yù)先經(jīng)過線程封裝的JAVA容器中。
[0010] 本發(fā)明還提供一種JAVA容器的同步化系統(tǒng),包括:
[0011] JAVA容器類型查看單元,用于查看JAVA容器的類型;
[001^ 線程封裝單元,用于在JAVA容器為Collection類型時,對Collection類型的JAVA 容器進行線程封裝,使Collection類型的JAVA容器中的集合轉(zhuǎn)換成同步化集合;
[0013] 線程迭代單元,用于在JAVA容器為非Collection類型時,將非Collection類型的 JAVA容器中的集合迭代到預(yù)先經(jīng)過線程封裝的Collection類型的JAVA容器中。
[0014] 利用上述本發(fā)明的JAVA容器的同步化方法及系統(tǒng),通過對JAVA容器進行安全線程 的封裝,將JAVA容器內(nèi)的集合封裝成同步化的集合,W固定集合中每個對象的位置,在迭代 器在新增迭代對象時,向JAVA容器的尾端追加新增的迭代對象,保證新增的迭代對象會被 迭代,在迭代器刪除迭代對象時,不釋放當前迭代對象的位置,W保證后續(xù)的每個迭代對象 不會因位置重新排序,導(dǎo)致迭代失效。
[0015] 為了實現(xiàn)上述W及相關(guān)目的,本發(fā)明的一個或多個方面包括后面將詳細說明并在 權(quán)利要求中特別指出的特征。下面的說明w及附圖詳細說明了本發(fā)明的某些示例性方面。 然而,運些方面指示的僅僅是可使用本發(fā)明的原理的各種方式中的一些方式。此外,本發(fā)明 旨在包括所有運些方面W及它們的等同物。
【附圖說明】
[0016] 通過參考W下結(jié)合附圖的說明及權(quán)利要求書的內(nèi)容,并且隨著對本發(fā)明的更全面 理解,本發(fā)明的其它目的及結(jié)果將更加明白及易于理解。在附圖中:
[0017] 圖巧根據(jù)本發(fā)明實施例的JAVA容器的同步化方法的流程示意圖;
[0018] 圖2為根據(jù)本發(fā)明實施例的JAVA容器的同步化系統(tǒng)的邏輯結(jié)構(gòu)示意圖。
[0019] 在所有附圖中相同的標號指示相似或相應(yīng)的特征或功能。
【具體實施方式】
[0020] 在下面的描述中,出于說明的目的,為了提供對一個或多個實施例的全面理解,闡 述了許多具體細節(jié)。然而,很明顯,也可W在沒有運些具體細節(jié)的情況下實現(xiàn)運些實施例。 在其它例子中,為了便于描述一個或多個實施例,公知的結(jié)構(gòu)和設(shè)備W方框圖的形式示出。
[0021] 名詞解釋
[0022] 集合:多個迭代對象所構(gòu)成的集合,每個迭代對象成為一個元素。
[0023] JAVA容器:用來存儲迭集合。
[0024] 迭代器:是一種對象,它能夠用來遍歷JAVA容器中的部分或全部元素,每個迭代器 對象代表JAVA容器中的確定的地址。
[0025] 同步化:是指線程同步的方法,即在發(fā)出一個功能調(diào)用時,在沒有得到結(jié)果之前, 該調(diào)用就不返回,同時其它線程也不能調(diào)用。
[0026] 傳統(tǒng)的迭代器在動態(tài)地增加或刪除迭代對象時,JAVA容器內(nèi)的迭代對象的位置會 變,由此引發(fā)出新增的迭代對象有可能不被遍歷的問題,或刪除迭代對象時,會導(dǎo)致后序的 迭代對象重新進行排序的問題。針對上述問題,本發(fā)明通過對JAVA容器進行線程封裝,將其 轉(zhuǎn)換為線程安全的JAVA容器,線程封裝實質(zhì)為對JAVA容器內(nèi)的集合進行同步化處理,同步 化的目的在于固定集合中每個迭代對象的位置,也就是固定JAVA容器的序列,當?shù)髟?新增迭代對象時,向JAVA容器的尾端追加新增的迭代對象,保證新增的迭代對象會被迭代, 在迭代器刪除迭代對象時,不釋放當前迭代對象的位置,W保證后續(xù)的每個迭代對象不會 因位置重新排序,導(dǎo)致迭代失效。
[0027] 圖1示出了根據(jù)本發(fā)明實施例的JAVA容器的同步化方法的流程。
[0028] 如圖1所示,本發(fā)明實施例提供的JAVA容器的同步化方法,包括:
[0029] 步驟S101:查看JAVA容器的類型。
[0030] 不同類型的JAVA容器,對應(yīng)有不同的固定迭代對象的方法,因此,需要判斷JAVA容 器的類型,根據(jù)JAVA容器的類型,采取對應(yīng)的方法。
[003。 JAVA容器的類型主要分為兩大類,一類為Col lection類型,另一類為非 Collection類型;其中,Collection類型的JAVA容器具有對應(yīng)的線程安全處理機制,能夠進 行線程封裝,W固定迭代對象的位置,線程封裝的過程在下文中詳述。而非Collection類型 的JAVA容器沒有對應(yīng)的線程安全處理機制,無法進行線程封裝,采取另一種方法固定迭代 對象的位置,該方法在下文中詳述。
[0032] 步驟S102:在JAVA容器為Collection類型時,對Collection類型的JAVA容器進行 線程封裝,使Collection類型的JAVA容器中的集合轉(zhuǎn)換成同步化集合。
[0033] 本發(fā)明對Collection類型的JAVA容器進行線程封裝的方法基于JAVA語言的底層 實現(xiàn),具體封裝過程為:
[0034] 將Collection類型的JAVA容器內(nèi)的集合轉(zhuǎn)換成同步化集合
[0035] Collection c = Collections. synchronizedCollection(myCollection);
[0036] 同步控制如下內(nèi)容
[0037] synchronized(c){
[0038] 獲取集合的迭代器
[0039] Iterator i = c. iterator();
[0040] 如果迭代器有下一個元素
[0041] while(i.has 化 xt〇)
[0042] 執(zhí)行元素相應(yīng)的動作
[0043] foo(i.nextO);
[0044] }
[0045] 通過上述線程封裝方法將Collection類型的JAVA容器內(nèi)的集合轉(zhuǎn)換成同步化集 合,W固定集合中每個迭代對象的位置。Collection類型的封裝方法為通用的封裝方法, Collection類型包括Ξ種子類型,分別為Map類型、List類型和Set類型,對于Ξ種子類型分 別有對應(yīng)的專用的封裝方法,也就是說,當JAVA容器在Map類型、List類型和Set類型范圍之 內(nèi),但不確定具體為哪種類型時,采用通用的封裝方法;當JAVA容器確定為Map類型、List類 型和Set類型中的一種時,既可W采用上述通過的封裝方法進行線程封裝,也可W采用自己 專用的封裝方法進行線程封裝,優(yōu)選地,采用自己專用的封裝方法進行線程封裝,原因在于 專用的封裝方法速度要快于通過的封裝方法。Ξ種專用的線程封裝方法也是基于JAVA語言 的底層實現(xiàn),具體封裝過程如下:
[0046] 當JAVA容器為Map類型時,其封裝過程為:
[0047] 將Map類型的JAVA容器內(nèi)的集合轉(zhuǎn)換成同步化集合 [004引 Map m = Collect ions.synch;ronizedMap(oldMap)
[0049]同步控制如下內(nèi)容
[00加]巧nc虹onized(m) {
[0051] 獲取集合的迭代器
[0052] Iterator i =m. iterator();
[0053] 如果迭代器有下一個元素
[0054] while(i.has 化 xt〇)
[0055] 執(zhí)行元素相應(yīng)的動作
[0056] foo(i.nextO);
[0化7] }
[0化引當JAVA容器為List類型時,其封裝過程為:
[0059]將Li S t類型的JAVA容器內(nèi)的集合轉(zhuǎn)換成同步化集合
[0060] List 1=Collections.synchronizedMap(oldList)
[0061] 同步控制如下內(nèi)容
[0062] sync虹onized(l){
[0063] 獲取集合的迭代器
[0064] Iterator i=1.iterator();
[0065] 如果迭代器有下一個元素
[0066] while(i.has 化 xt〇)
[0067] 執(zhí)行元素相應(yīng)的動作
[006引 foo(i.nextO);
[0069] }
[0070] 當JAVA容器為Set類型時,其封裝過程為:
[0071] 將Set類型的JAVA容器內(nèi)的集合轉(zhuǎn)換成同步化集合
[0072] Set s = Collections.synchronizedMap(oldSet)
[0073] 同步控制如下內(nèi)容
[0074] synchronized(s) {
[0075] 獲取集合的迭代器