2020年J集合框架的線程安全_第1頁(yè)
2020年J集合框架的線程安全_第2頁(yè)
2020年J集合框架的線程安全_第3頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、安全生產(chǎn)) J 集合框架的線程安全Java集合框架的線程安全周慶岳Java 集合框架是由 Java 平臺(tái)標(biāo)準(zhǔn)版 1.2 (JavaSE1.2)引入的通用數(shù)據(jù)結(jié)構(gòu) 和算法框架。其靈活的面對(duì)對(duì)象設(shè)計(jì)受到了廣大 Java程序員的壹致青睞, 為Java 平臺(tái)的成熟奠定了堅(jiān)實(shí)的基礎(chǔ)。壹個(gè)集合(也稱容器)是指將壹組元素組合成壹個(gè)單元的簡(jiǎn)單對(duì)象。集合用 于存儲(chǔ)、取回、操作和傳遞這些聚合的元素。集合框架是指壹個(gè)統(tǒng)壹的用來(lái)表示 和操作集合的體系結(jié)構(gòu) Bloch , 1999 。最簡(jiǎn)單的集合如數(shù)組、列表和隊(duì)列等, 集合框架最著名的例子如 C+ 標(biāo)準(zhǔn)庫(kù)( STL)。線程安全不是壹個(gè)全有或全無(wú)的問(wèn)題,難以對(duì)其進(jìn)行精確

2、的定義。線程安全 籠統(tǒng)地講是指程序在多線程環(huán)境下運(yùn)行時(shí)的正確性。 Java 集合框架的設(shè)計(jì)者 BlochJoshua 在他著名的 Java 高效編程壹書(shū)中對(duì) Java 線程安全的等級(jí)做出 了相對(duì)精確的定義 Bloch ,2001 :非可變、線程安全、條件線程安全、線程兼 容和線程不友好。本文將結(jié)合上述 Bloch 關(guān)于線程安全等級(jí)的定義,對(duì) Java 集合框架中的集 合類進(jìn)行線程安全性分析,且指出各個(gè)集合類在現(xiàn)實(shí)的編程環(huán)境中需要注意的且 發(fā)編程的陷阱;同時(shí)對(duì)集合框架中通用算法對(duì)線程安全性的影響進(jìn)行分析。所涉 及的集合類不僅包括 JavaSE1.2 引入的集合類,仍包括舊集合類( JavaSE1

3、.2 前 引入)和新集合類( JavaSE5 引入)。從而幫助 Java 程序員在進(jìn)行且發(fā)編程時(shí)更加高效地利用 Java集合框架Java 線程安全的等級(jí)定義根據(jù) Bloch 的定義,將線程安全分為五個(gè)等級(jí),下面將給出這五個(gè)等級(jí)的描 述和部分示例。1、非可變?nèi)绻紓€(gè)類的所有實(shí)例對(duì)于調(diào)用它們的客戶端對(duì)象總是恒定不變的,而無(wú)需 外部同步,則稱為非可變的。字符串類和整數(shù)類都是非可變的,但在集合框架中 且沒(méi)有提供直接的非可變類,而是通過(guò)對(duì)可變類進(jìn)行封裝而得到非可變類。非可變集合不可修改, 因而它能夠在各個(gè)線程間安全共享而無(wú)需額外的同步。 作為壹個(gè)好的實(shí)踐準(zhǔn)則,壹旦生成非可變類之后,不要再持有被其封裝的集

4、合類 的引用,這樣才能夠完全保證其非可變性。2、線程安全類的實(shí)例是可變的,但它的所有方法已經(jīng)通過(guò)使用足夠的內(nèi)部同步使其實(shí)例 能夠被且發(fā)的使用而無(wú)需外部同步。且發(fā)的調(diào)用將會(huì)以某種全局壹致的方式連續(xù) 地執(zhí)行。隨機(jī)類和定時(shí)器類都是線程安全類。集合框架中線程安全的類且發(fā)哈希 映射類在 JavaSE5中被引入,它且不包含在原來(lái)的集合框架中,但它實(shí)現(xiàn)了集合 框架Map 接口。且發(fā)哈希映射類實(shí)現(xiàn)了且發(fā)和效率之間的高效平衡,已被作為哈 希表類和同步映射表封裝在且發(fā)環(huán)境下的高效替代品。3、條件線程安全除了某些方法需要在沒(méi)有其它線程的干擾的情況下順次執(zhí)行之外,條件線程 安全類和線程安全類類似。為了消除線程干擾的可

5、能性,客戶端對(duì)象在調(diào)用這類 方法的過(guò)程中需要獲得該集合類對(duì)象的鎖來(lái)進(jìn)行同步。 壹些舊集合類如 Vector 和 Hashtable 都是條件線程安全類,對(duì)這些集合類進(jìn)行遍歷操作時(shí)需要對(duì)其進(jìn)行外部同步4、線程兼容對(duì)其對(duì)象實(shí)例的所有方法調(diào)用都通過(guò)外部同步之后再進(jìn)行,線程兼容類能夠 安全的且發(fā)使用。集合框架中的通用目的集合的標(biāo)準(zhǔn)實(shí)現(xiàn),如數(shù)組鏈表類和哈希映射表類等都 是線程兼容的類。 對(duì)線程安全的集合類進(jìn)行遍歷操作, 需要先獲得壹個(gè)對(duì)它的條 件線程類封裝,然后再通過(guò)外部同步來(lái)進(jìn)行遍歷。5、線程不友好線程不友好類無(wú)法在多線程環(huán)境下安全地且發(fā)使用,即使對(duì)其所有的方法調(diào) 用都進(jìn)行外部同步。 Java語(yǔ)言中只

6、有很少幾個(gè)類的方法是線程敵對(duì)的,已經(jīng)被聲 明為不贊成使用。Java 集合框架抽象接口及其實(shí)現(xiàn)的線程安全Java 集合框架包括三個(gè)部分 Bloch ,1999 :接口、實(shí)現(xiàn)和算法。接口是抽象數(shù)據(jù)類型的表示集合,接口使得集合的操作和集合的具體實(shí)現(xiàn)細(xì)節(jié)相獨(dú)立。在面對(duì)對(duì)象的語(yǔ)言里,這些接口壹般形成壹個(gè)層次結(jié)構(gòu)。實(shí)現(xiàn)是指表示這些集合接口的具體實(shí)現(xiàn),實(shí)質(zhì)上是可重用的數(shù)據(jù)結(jié)構(gòu),即通 用集合類。算法是指能夠?qū)?shí)現(xiàn)集合接口的類進(jìn)行壹些實(shí)用計(jì)算的方法,比如排序和查 找。這些算法能夠說(shuō)是多態(tài)的,同壹個(gè)方法能夠用于實(shí)現(xiàn)了適當(dāng)接口的不同實(shí)現(xiàn) 類。這些算法實(shí)質(zhì)上是可重用的功能。Java 集合框架的接口層次和通用實(shí)現(xiàn)如下:

7、圖 1Java 集合框架的接口層次接口通用實(shí)現(xiàn)集合哈希集合、樹(shù)集合和鏈接哈希集合列表數(shù)組鏈表和鏈接鏈表隊(duì)列優(yōu)先級(jí)隊(duì)列映射表哈希映射表、樹(shù)映射表和鏈接哈希映射表表 1Java 接口的通用實(shí)現(xiàn)下面按接口分類對(duì)集合類進(jìn)行線程安全分析。 分析的對(duì)象主要包括表 1 中的通用 實(shí)現(xiàn)類,仍包括壹些特殊用途的實(shí)現(xiàn)類。1、集合接口 集合是不包含重復(fù)元素的抽象集合。實(shí)現(xiàn)該接口的集合類包括三個(gè)通用實(shí)現(xiàn) 類哈希集合類、樹(shù)集合類和鏈接哈希集合類,倆個(gè)特殊用途實(shí)現(xiàn)類枚舉集合類和 寫(xiě)復(fù)制數(shù)組集合類。三個(gè)通用實(shí)現(xiàn)類和枚舉集合類都是線程兼容類,對(duì)這些集合類的且發(fā)訪問(wèn)都 需要進(jìn)行外部同步。特別是遍歷操作,需要先通過(guò)調(diào)用 Coll

8、ections.synchronizedSet() 方法返回壹個(gè)條件線程安全的同步集合類封裝, 然后再對(duì)其進(jìn)行同步遍歷。特殊實(shí)現(xiàn)類寫(xiě)復(fù)制數(shù)組集合類是線程安全類,能夠安全地且發(fā)訪問(wèn),只是其 寫(xiě)操作開(kāi)銷較大,壹般用在較少修改的環(huán)境。2、鏈表接口鏈表是有序的抽象集合,能夠允許重復(fù)元素存在。仍允許對(duì)其進(jìn)行基于位置的訪問(wèn)。實(shí)現(xiàn)該接口的集合類包括倆個(gè)通用實(shí)現(xiàn)類數(shù)組鏈表和鏈接鏈表,壹個(gè)特 殊用途實(shí)現(xiàn)類寫(xiě)復(fù)制數(shù)組鏈表類,仍包括舊的集合類矢量類。通用實(shí)現(xiàn)類數(shù)組鏈表和鏈接鏈表是線程兼容類,如果未先進(jìn)行同步而且發(fā)使 用,會(huì)拋出且發(fā)修改異常。遍歷方法同集合接口 (Set) 的通用實(shí)現(xiàn)類似。特殊實(shí)現(xiàn)類寫(xiě)復(fù)制數(shù)組鏈表類是

9、線程安全類,且發(fā)特性和寫(xiě)復(fù)制數(shù)組集合類 類似,實(shí)際上寫(xiě)復(fù)制數(shù)組集合類就是基于寫(xiě)復(fù)制數(shù)組鏈表類的壹個(gè)集合實(shí)現(xiàn)。3、隊(duì)列接口隊(duì)列被設(shè)計(jì)成保存元素功能優(yōu)先于處理元素功能的抽象集合。隊(duì)列接口在JavaSE5 中被引入 Java 集合框架,優(yōu)先隊(duì)列是其通用實(shí)現(xiàn)類, 鏈表通用實(shí)現(xiàn)之壹 也被重寫(xiě)實(shí)現(xiàn)了隊(duì)列接口。 此外,仍有數(shù)組阻塞隊(duì)列、 且發(fā)鏈接隊(duì)列、 延時(shí)隊(duì)列、 鏈接阻塞隊(duì)列、優(yōu)先級(jí)阻塞隊(duì)列和同步隊(duì)列六個(gè)特殊實(shí)現(xiàn)類。除了且發(fā)鏈接隊(duì)列是線程安全類之外,其他實(shí)現(xiàn)都是線程兼容類。4、映射表接口 映射表是用于鍵值映射的抽象集合,不允許存在重復(fù)的鍵,每個(gè)鍵至多允 許映射到壹個(gè)值。映射表包括倆個(gè)通用實(shí)現(xiàn)類哈希映射表和

10、樹(shù)映射表,仍包括且 發(fā)哈希映射表和弱引用哈希映射表等特殊實(shí)現(xiàn)類。哈希映射表和樹(shù)映射表是線程兼容類。且發(fā)哈希映射表類是線程安全的,而 且由于其優(yōu)秀的算法設(shè)計(jì),使其再保證線程安全的同時(shí)仍提供了高度的且發(fā)性。弱引用哈希映射表類壹般作為高速緩存使用,它內(nèi)部使用弱引用作為鍵,它 的行為依賴于具體的 Java 虛擬機(jī)的垃圾收集器,即使對(duì)其進(jìn)行外部同步也不能 保證其壹致性,因而弱引用哈希映射表類是線程不友好的集合類。5、封裝實(shí)現(xiàn)除了上述提及的集合接口的通用和特殊實(shí)現(xiàn)之外, Java 集合框架仍提供了幾類封 裝實(shí)現(xiàn)。其中包括同步封裝類和非可變封裝類。同步封裝方法如:Collections.synchroniz

11、edCollection(Collectionc) 返回壹個(gè)集合 c的原子同步封裝,即它的所有方法都已被同步,是壹個(gè)條件線程 安全類。在對(duì)同步封裝類訪問(wèn)需要先獲得該對(duì)象的同步鎖,之后便可實(shí)現(xiàn)且發(fā)訪 問(wèn)。 Java集合框架提供的同步封裝類能夠提升通用實(shí)現(xiàn)類的線程安全等級(jí)。壹般 的通用實(shí)現(xiàn)只有線程兼容等級(jí),在需要較高安全等級(jí)的情況下,如且發(fā)遍歷,就 需要利用同步封裝類。非可變封裝方法如:Collections.unmodifiableCollection(Collectionc) 返回壹個(gè)集合 c的只讀視圖,是壹個(gè)非可變類。Java 集合框架通用算法對(duì)線程安全的要求Java 集合框架的算法功能不是

12、作為各個(gè)集合的功能函數(shù),而是獨(dú)立出來(lái)作為 對(duì)某壹類實(shí)現(xiàn)合適接口的類進(jìn)行通用操作,從而實(shí)現(xiàn)算法功能的多態(tài)性。 通用的算法包括排序、混淆、搜索和查找極限值等。 排序和混淆是壹對(duì)相反的操作,倆者都要對(duì)集合進(jìn)行寫(xiě)操作,要保證算法在且發(fā) 環(huán)境下執(zhí)行的正確性,要求寫(xiě)操作要在線程安全集合類上執(zhí)行。對(duì)于只具有線程 兼容等級(jí)的集合類,要先利用同步封裝類將其線程安全等級(jí)提升到條件線程安 全;對(duì)于具有條件線程安全的集合類,則需進(jìn)行外部同步。通過(guò)之上步驟,被操 作集合就具有線程安全等級(jí)了,能夠保證算法被正確執(zhí)行。另壹種方法是對(duì)被操 作集合類進(jìn)行保護(hù)性拷貝,則總能保證算法的正確性,這種方法代價(jià)較高,但能 提高且發(fā)性。另壹類算法搜索和查找極限值比較類似,都只需進(jìn)行讀操作。除了利用排序和混 淆用的倆種方法外,由于是只讀操作,仍能夠利用非可變封裝先獲得集合的壹個(gè) 視圖,然后在該視圖上實(shí)現(xiàn)查找。結(jié)論Java 集合框架采用接口和實(shí)現(xiàn)相分離的面對(duì)對(duì)象設(shè)計(jì)方法,給 Java 平臺(tái)帶 來(lái)了壹個(gè)靈活高效的數(shù)據(jù)結(jié)構(gòu)和算法工具箱。線程安全特性在 Java 集合框架中 屬于實(shí)現(xiàn)細(xì)節(jié),因而集合框架的接口協(xié)議中且未提供相應(yīng)的線程安全性保證???是線程安全是 Java 程序正確運(yùn)行基本前提之壹,因此本文在保證程序正確性的 前提條件下,對(duì) Java 集合框架的集合類進(jìn)行安全等級(jí)分類,且對(duì)各種算法操作 的所要求的線程等級(jí)進(jìn)行

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論