一、同步容器類
同步容器類包含Vector,Hashtable。以及在JDK1.2中添加的一些功能類似的容器類,他們是由Collections.synchronisedXxx等工廠方法創(chuàng)建的。這些類實現(xiàn)線程安全的方式就是將底層容器類的狀態(tài)變量封裝起來,并且同步每一個公有的方法,使得每次只能有一個線程訪問底層容器類的狀態(tài)變量。
在使用同步容器類提供的公共接口的時候,容器類是線程安全的。但是如果需要在現(xiàn)有的接口上組合成新的操作是,容器的線程安全性就有可能遭到破壞:
(1)迭代操作的問題

兩個原子操作之間可能存在可能存在另一個線程已經(jīng)更改vector的內(nèi)部狀態(tài),此時get(i)可能取不到。拋出異常
上述問題還存在條件運算(若沒有則添加)等操作中。
二、并發(fā)容器類
(1)ConcurrentHashMap并不是將每個方法都在同一個鎖上進行同步并且每次只有一個線程可以訪問容器。而是使用了一種更細粒度的加鎖機制來最大程度實現(xiàn)容器在線程中的共享,該機制稱為分段鎖(LockStriping)。在這種機制中,任意數(shù)量的讀取線程可以并發(fā)的訪問Map,并且一定數(shù)量的寫操作線程可以并發(fā)的修改Map。從而在多線程環(huán)境中帶來更高的吞吐量。
(2)ConcurrentHashMap與其他并發(fā)容器類一起增強了同步容器類:他們提供的迭代器不會拋出ConcurrentModificationException,因此不需要再迭代過程中對容器進行加鎖。ConcurrentModificationException生成的迭代器具有弱一致性,可以迭代器生成后在進行遍歷的時候可以容忍其他線程對容器的修改,而不會及時拋出異常。
(3)額外的原子Map操作



以下是關(guān)于CopyOnWriteArrayList的相關(guān)資料

(1)阻塞隊列

Web 便箋來自: http://ifeve.com/java-blocking-queue/.
(2)雙端隊列與工作密取

線程的的阻塞原因有多種,比較常見的阻塞場景如下:線程等待IO操作的完成;線程等待獲取一個鎖;等待從Thread.sleep()中醒過來。當線程被阻塞時,他通常被掛起并處于一種阻塞狀態(tài)(Blocked,Waiting或者Timed_Waiting)。阻塞操作與某個執(zhí)行時間很長的操作區(qū)別在于被阻塞的線程必須等待外部某個不受其控制的時間發(fā)生(IO操作完成,其他線程釋放該線程要獲取的鎖等)他才能夠繼續(xù)執(zhí)行。當某個外部事件發(fā)生時該線程的狀態(tài)被置為Runnable,并可以再次被調(diào)度執(zhí)行。
同步工具類可以是任何一個對象,只要它根據(jù)自身的狀態(tài)來協(xié)調(diào)線程的控制流。阻塞隊列可以作為同步工具類。其他類型的工具類包括:信號量(Semaphore),柵欄(Barrier)以及閉鎖(Latch)

(1)閉鎖

Web 便箋來自: http://www.heishou.com.cn/simple/?t156923.html.
(2)FutureTask
Future模式:在現(xiàn)實中,可能會有這樣一種應用場景我們開啟主線程A去做一件事情,例如瀏覽網(wǎng)頁,在瀏覽網(wǎng)頁的過程中可能需要加載圖片和視頻,如果我們用串行的方式去執(zhí)行這個步驟的話,那么必須等待一個圖片或者視頻加載完成之后才能繼續(xù)往下瀏覽網(wǎng)頁,這樣效率是極低的。因此我們考慮這樣一種實現(xiàn),主線程A會開啟另外一個線程去加載圖片和視頻,當A線程瀏覽到某個圖片的時候直接將副線程的加載結(jié)果拿來用即可。

來自:http://blog.csdn.net/ghsau/article/details/7451464
(3)信號量(Semaphore)
信號量的作用是控制同時訪問某個資源的操作的個數(shù),或者同時執(zhí)行某項指定操作數(shù)量。Semaphore內(nèi)部管理著一組虛擬的許可,許可的數(shù)目可以在初始化對象的時候有構(gòu)造函數(shù)指定。如果一個共享的資源需要通過Semaphore來控制并發(fā)訪問的線程數(shù)(例如某個對象池每次允許5個線程同時訪問,假設現(xiàn)在有10個線程同時運行),那么每次線程需要訪問該資源的時候就需要先調(diào)用Semaphore上的acquire方法來獲取許可,如果現(xiàn)在對象池的并發(fā)訪問線程數(shù)目已經(jīng)達到最大值,即Semaphore上的許可數(shù)目為0,那么該線程會被阻塞,直到有其他線程釋放資源,即Semaphore上的許可不為0。線程每次訪問完資源之后需要釋放許可,調(diào)用Semaphore的release()方法來釋放許可。

Web便簽來自:http://outofmemory.cn/code-snippet/2477/JAVA-xinhaoliang-Semaphore-usage
(4)柵欄
新聞熱點
疑難解答