JDK 6中的java.util.concurrent包下工具 + 生產力類

來源:互聯網
上載者:User
執行程式

介面。Executor 是一個簡單的標準化介面,用於定義類似於線程的自訂子系統,包括線程池、非同步 IO 和輕量型工作架構。根據所使用的具體 Executor 類的不同,可能在新建立的線程中,現有的任務執行線程中,或者調用 execute() 的線程中執行任務,並且可能順序或並發執行。ExecutorService 提供了多個完整的非同步任務執行架構。ExecutorService 管理工作的排隊和安排,並允許受控制的關閉。ScheduledExecutorService 子介面及相關的介面添加了對延遲的和定期任務執行的支援。ExecutorService 提供了安排非同步執行的方法,可執行由 Callable 表示的任何函數,結果類似於 RunnableFuture 返回函數的結果,允許確定執行是否完成,並提供取消執行的方法。RunnableFuture 是擁有 run 方法的 Future,run 方法執行時將設定其結果。

實現。類 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 提供可調的、靈活的線程池。Executors 類提供大多數 Executor 的常見類型和配置的Factory 方法,以及使用它們的幾種工具 + 生產力方法。其他基於 Executor 的工具 + 生產力包括具體類 FutureTask,它提供 Future 的常見可擴充實現,以及ExecutorCompletionService,它有助於協調對非同步工作群組的處理。

隊列

java.util.concurrent ConcurrentLinkedQueue 類提供了高效的、可伸縮的、安全執行緒的非阻塞 FIFO 隊列。java.util.concurrent 中的五個實現都支援擴充的BlockingQueue 介面,該介面定義了 put 和 take 的阻塞版本:LinkedBlockingQueueArrayBlockingQueueSynchronousQueuePriorityBlockingQueue 和DelayQueue。這些不同的類覆蓋了生產者-使用者、訊息傳遞、並行任務執行和相關並發設計的大多數常見使用的上下文。BlockingDeque 介面擴充BlockingQueue,以支援 FIFO 和 LIFO(基於堆棧)操作。LinkedBlockingDeque 類提供一個實現。

計時

TimeUnit 類為指定和控制基於逾時的操作提供了多重粒度(包括納秒級)。該包中的大多數類除了包含不確定的等待之外,還包含基於逾時的操作。在使用逾時的所有情況中,逾時指定了在表明已逾時前該方法應該等待的最少時間。在逾時發生後,實現會“儘力”檢測逾時。但是,在檢測逾時與逾時之後再次實際執行線程之間可能要經過不確定的時間。接受逾時期參數的所有方法將小於等於 0 的值視為根本不會等待。要“永遠”等待,可以使用 Long.MAX_VALUE 值。

同步器

四個類可協助實現常見的專用同步語句。Semaphore 是一個經典的並發工具。CountDownLatch 是一個極其簡單但又極其常用的工具 + 生產力,用於在保持給定數目的訊號、事件或條件前阻塞執行。CyclicBarrier 是一個可重設的多路同步點,在某些並行編程風格中很有用。Exchanger 允許兩個線程在 collection 點交換對象,它在多流水線設計中是有用的。

並發 Collection

除隊列外,此包還提供了設計用於多線程上下文中的 Collection 實現:ConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSetCopyOnWriteArrayList和 CopyOnWriteArraySet。當期望許多線程訪問一個給定 collection 時,ConcurrentHashMap 通常優於同步的 HashMap,ConcurrentSkipListMap 通常優於同步的TreeMap。當期望的讀數和遍曆遠遠大於列表的更新數時,CopyOnWriteArrayList 優於同步的 ArrayList。

此包中與某些類一起使用的“Concurrent”首碼;是一種簡寫,表明與類似的“同步”類有所不同。例如,java.util.Hashtable 和Collections.synchronizedMap(new HashMap()) 是同步的,但 ConcurrentHashMap 則是“並發的”。並發 collection 是安全執行緒的,但是不受單個獨佔鎖定的管理。在 ConcurrentHashMap 這一特定情況下,它可以安全地允許進行任意數目的並發讀取,以及數目可調的並發寫入。需要通過單個鎖不允許對 collection 的所有訪問時,“同步”類是很有用的,其代價是較差的延展性。在期望多個線程訪問公用 collection 的其他情況中,通常“並發”版本要更好一些。當 collection 是未共用的,或者僅保持其他鎖時 collection 是可訪問的情況下,非同步 collection 則要更好一些。

大多數並發 Collection 實現(包括大多數 Queue)與常規的 java.util 約定也不同,因為它們的迭代器提供了弱一致的,而不是快速失敗的遍曆。弱一致的迭代器是安全執行緒的,但是在迭代時沒有必要凍結 collection,所以它不一定反映自迭代器建立以來的所有更新。

記憶體一致性屬性

Java Language Specification 第 17 章定義了記憶體操作(如共用變數的讀寫)的 happen-before 關係。只有寫入操作 happen-before 讀取操作時,才保證一個線程寫入的結果對另一個線程的讀取是可視的。synchronized 和 volatile 構造 happen-before 關係,Thread.start() 和 Thread.join() 方法形成 happen-before 關係。尤其是:

  • 線程中的每個操作 happen-before 稍後按程式順序傳入的該線程中的每個操作。
  • 一個解除鎖監視器的(synchronized 阻塞或方法退出)happen-before 相同監視器的每個後續鎖(synchronized 阻塞或方法進入)。並且因為 happen-before 關係是可傳遞的,所以解除鎖定之前的線程的所有操作 happen-before 鎖定該監視器的任何線程後續的所有操作。
  • 寫入 volatile 欄位 happen-before 每個後續讀取相同欄位。volatile 欄位的讀取和寫入與進入和退出監視器具有相似的記憶體一致性效果,但 需要互斥鎖。
  • 線上程上調用 start happen-before 已啟動的線程中的任何線程。
  • 線程中的所有操作 happen-before 從該線程上的 join 成功返回的任何其他線程。

java.util.concurrent 中所有類的方法及其子包擴充了這些對更進階別同步的保證。尤其是:

  • 線程中將一個對象放入任何並發 collection 之前的操作 happen-before 從另一線程中的 collection 訪問或移除該元素的後續操作。
  • 線程中向 Executor 提交 Runnable 之前的操作 happen-before 其執行開始。同樣適用於向 ExecutorService 提交 Callables
  • 非同步計算(由 Future 表示)所採取的操作 happen-before 通過另一線程中 Future.get() 擷取結果後續的操作。
  • “釋放”同步儲存方法(如 Lock.unlockSemaphore.release 和 CountDownLatch.countDown)之前的操作 happen-before 另一線程中相同同步儲存對象成功“擷取”方法(如 Lock.lockSemaphore.acquireCondition.await 和 CountDownLatch.await)的後續操作。
  • 對於通過 Exchanger 成功交換對象的每個線程對,每個線程中 exchange() 之前的操作 happen-before 另一線程中對應 exchange() 後續的操作。
  • 調用 CyclicBarrier.await 之前的操作 happen-before 屏障操作所執行的操作,屏障操作所執行的操作 happen-before 從另一線程中對應 await 成功返回的後續操作。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.