java中concurrent包內容

有BlockingQueue及其相關的類,跟阻塞隊列有關係。前面已經作過介紹 
ConcurrentHashMap,ConcurrentLinkedQueue等,這些是相關集合的線程同步版本。 
CopyOnWriteArrayList,也是一種併發用的容器,當咱們改變這個數組的時候,先複製一個副本,修改這個副本,再複製回去。這樣就實現了讀寫分離,適用於讀多寫少的併發場景。 
CountDownLatch,這個類適用於這種狀況:多個線程同時工做,而後其中幾個能夠隨意併發執行,但有一個線程須要等其餘線程工做結束後,才能開始。 
該類裏面維護一個計數器,經過構造器傳入一個初始的count,裏面有兩個經常使用方法,一個是cutDown(),將計數器的數值-1,還有await(),調用await()的線程將一直阻塞,直到裏面的計數器值爲0。 
CountedCompleter,這是個java8新增的類,我也看不懂是幹啥的,有興趣的讀者自行閱讀Java文檔:http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountedCompleter.html 
CyclicBarrier,同步屏障。當有許多線程併發執行時,能夠設置一個屏障,讓全部線程執行到屏障時阻塞,直到最後一個線程運行到屏障時,才讓全部線程繼續往下執行。 
DelayQueue,一個延遲阻塞隊列,裏面的對象只有在其到期的時候才能取走,不然阻塞線程。(以前第4期咱們探討過ScheduleThreadPoolExecutor的時候,裏面就有這個東西) 
Exchanger,能夠在兩個線程之間交換數據,只能是2個線程,他不支持更多的線程之間互換數據。 
Executor一系列,跟線程池有關係。 
ForkJoinPool,Fork/Join模式下的線程池。聽說是對多核支持比較好。 html

    Fork/Join框架,是java 7提供的一個用於並行執行任務的框架,是一個把大任務分割成若干個小任務,最終彙總每一個小任務結果後獲得大任務結果的框架。java

    工做竊取算法,是指某個線程從其餘隊列裏竊取任務來執行。減小竊取任務與被竊取任務線程之間的競爭,一般會使用雙端隊列,分別從頭部與尾部拿任務執行。優勢是充分利用線程進行並行計算,減小了線程間的競爭。缺點是某些狀況下仍是存在競爭,好比雙端隊列中只有一個任務。而且該算法會消耗了更多的系統資源,好比建立多個線程和多個雙端隊列。算法


FutureTask,是Future的實現,用於獲取Callable和Runnable對象的執行狀態、結果等。 api

    FutureTask除了實現Future接口外,還實現了Runnable接口。所以,FutureTask能夠交給Executor執行,也能夠由線程直接執行(FutureTask.run())數組

    還能夠經過ExecutorService.submit()方法返回一個FutureTask,而後執行FutureTask.get()方法或FutureTask.cancel()方法。多線程

    當一個線程須要等待另外一個線程把某個任務執行完後才能繼續執行,此時可使用FutureTask併發

    FutureTask的實現,也是經過內部靜態類實現AbstractQueuedSynchronizer,隊列同步器中的tryAcquireShared(int)和tryReleaseShared(int)方法,來檢查和更新同步狀態。oracle

    FutureTask.get()方法會調用AQS.acquireSharedInterruptibly(int arg)方法,這個方法執行過程以下框架

    1)調用AQS.acquireSharedInterruptibly(int arg)方法,這個方法首先會回調在子類Sync中實現的tryAcquiredShared()方法來判斷acquire操做是否能夠成功。能夠成功的條件:state爲執行完成狀態RAN或已取消狀態CANCELLED,且runner不爲nulldom

    2)若是成功則get()方法當即返回,若是失敗則到線程等待隊列中去等待其餘線程執行release操做

    3)當其餘線程執行release操做(好比FutureTask.run()或FutureTask.cancel(...))喚醒當前線程,當前線程再次執行tryAcquireShared()將返回正值1,當前線程將離開線程等待隊列並喚醒它的後繼線程(這裏會產生級聯喚醒的效果)

    4)最後返回計算的結果並拋出異常


Phaser,是jdk7新增的一個線程同步工具,跟CountDownLatch和CyclicBarrier有些功能是重複的。 
Semaphore,就是OS課上學過的信號量,用於控制一個資源可同時被幾個線程訪問。 
SynchronousQueue,是一種隊列,這種隊列能夠用來模擬生產-消費者模型,由於它的元素入隊以後要想再入隊必須等候一個出隊操做。 
ThreadLocalRandom,一個線程同步的隨機數生成器,在高併發下生成隨機數比Random快。 
大體就這些了,還有一些類都是與之相關的。

還有兩個子包atomic和locks,其中atomic是對一些數的再封裝,保證在多線程下這些數的操做都是原子性的。(例如普通的i++就不是原子的)locks裏面則是提供了各類線程同步鎖,其中ReentrantLock比較經常使用。

上面說的都比較泛,若是真的要深度解析java.util.concurrent包中的每個類,恐怕十篇博文都不夠。

相關文章
相關標籤/搜索