【併發編程】Java對併發編程的支持歷史


本博客系列是學習併發編程過程當中的記錄總結。因爲文章比較多,寫的時間也比較散,因此我整理了個目錄貼(傳送門),方便查閱。html

併發編程系列博客傳送門java

本文轉載,原文請點擊連接

本章主要對Java併發(Concurrent)在不一樣jdk版本中的發展簡史進行學習。Java語言從初版本至今,內置了對併發(Concurrent)的各類支持技術。爲了可以讓咱們在學習Java併發(Concurrent)時,不被各類各樣的併發技術弄得暈頭轉向,本章先對Java個版本中的主要併發技術進行簡述。編程

1. JDK1.4及以前

在JDK1.4及以前的版本,主要提供的併發技術有:併發

  • synchronized關鍵字
  • volatile關鍵字
  • 不變模式

1.1 volatile關鍵字

引用百度百科的解釋:框架

volatile是一個類型修飾符(type specifier),就像你們更熟悉的const同樣,它是被設計用來修飾被不一樣線程訪問和修改的變量。volatile的做用是做爲指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。ide

注:百度百科的解釋並非專門針對java語音中的volatile,而是C語音,不過其設計思想類型,能夠拿來借鑑。性能

更通俗易懂的說法,在Java語音中,使用volatile關鍵字的目的:學習

  • 標識這個變量是易變型變量
  • 保證這個變量的可見性
  • 保證必定的有序性

volatile關鍵字還涉及到JMM(Java內存模型,Java Memory Model)以及併發的三個特性(原子性、有序性和可見性),關於volatile關鍵字的更多內容,計劃在後續章節中進行更加詳細的學習。優化

1.2 synchronized關鍵字

引用百度百科的一段解釋:ui

synchronized 關鍵字,表明這個方法(或代碼塊)加鎖,至關於無論哪個線程(例如線程A),運行到這個方法時,都要檢查有沒有其它線程B(或者C、 D等)正在用這個方法(或者該類的其餘同步方法),有的話要等正在使用synchronized方法的線程B(或者C 、D)運行完這個方法後再運行此線程A,沒有的話,鎖定調用者,而後直接運行。它包括兩種用法:synchronized 方法 和 synchronized 代碼塊 。

簡單來講,synchronized關鍵字以同步方法和同步代碼塊的方式,爲方法和代碼塊上的對象加鎖。使得同一時刻,在這個對象上的多個線程,只能由持有這個對象鎖的單個線程進行代碼的調用執行。

synchronized 關鍵字可以保證代碼的原子性、可見性和有序性。

關於synchronized關鍵字的更多內容,計劃在後續章節中進行更加詳細的學習。

1.3 不變模式

所謂不變模式,就是指:在併發編程中,爲確保數據的一致性和正確性,使用一種不可改變的對象。依靠其不可變的性質,來確保在沒有同步的狀況下依舊保持一致性和正確性。

Java中不變模式相關技術有:

  • final關鍵字
  • String類型

關於不變模式,就簡單進行這些介紹。若是感興趣,能夠自行學習。

2. JDK5

衆所周知,JDK5是Java發展的一個重要版本,提供了不少技術,如泛型 Generic、枚舉類型 Enumeration、可變參數varargs、註解 Annotations等等。

在JDK1.5版本中,也提供了對併發編程極爲重要的一個包:java.util.concurrent(併發包)

java.util.concurrent(併發包)提供了一些列較爲給力的併發技術,主要有:

  • 原子(Atomic)類型:如AtomicInteger、AtomicReference等,保證變量的原子性和可見性。
  • 顯式鎖(Lock)接口:對以前版本鎖機制的重構,相較於synchronized 關鍵字,可以提供更加靈活的特性,如:可以指定鎖定公平性、能夠實現分組喚醒(Condition)、性能更好的鎖。主要包括:Lock接口、ReadWriteLock接口和Condition接口。
  • 計數器(CountDownLatch):利用它能夠實現相似計數器的功能。好比有一個任務A,它要等待其餘4個任務執行完畢以後才能執行。
  • 迴環柵欄(CyclicBarrier):經過它能夠實現讓一組線程等待至某個狀態以後再所有同時執行。叫作迴環是由於當全部等待線程都被釋放之後,CyclicBarrier能夠被重用。
  • 信號量(Semaphore):Semaphore能夠控同時訪問的線程個數,經過 acquire() 獲取一個許可,若是沒有就等待,而 release() 釋放一個許可。
  • 併發集合:即集合類在併發環境下的版本。主要有:BlockingQueue(Queue)、ConcurrentMap(Map)、ConcurrentHashMap(HashMap)、CopyOnWriteArrayList(ArrayList)。
  • Callable和Future接口:爲了解決繼承Thread類和實現Runnable接口存在的弊端(不容許聲明檢查型異常,不能定義返回值),而引入的線程的新的定義方式。
  • 執行器(Executor接口):Executors相關類隱藏瞭如何處理Runnable的細節,提供了一組方法,可以建立擁有完善配置的線程池和executor。

關於原子(Atomic)類型、顯式鎖(Lock)接口、併發集合、Callable和Future接口、執行器(Executor接口)的更多內容,計劃在後續章節中進行更加詳細的學習。

3. JDK7

在JDK1.7版本中,主要提供的併發編程技術有:

  • TransferQueue:比BlockingQueue性能更好的併發集合實現。
  • 分支合併(Fork/Join)框架:運用分治法(divide-and-conquer)的思想,實現線程池中任務的自動調度,而且這種調度對用戶來講是透明的,典型應用ForkJoinPool。

關於分支合併(Fork/Join)框架的更多內容,計劃在後續章節中進行更加詳細的學習。

4.JDK8

在JDK.18版本中,主要提供的併發編程技術有:

  • 加法器(Adder)和累加器(Accumulator):原子類型的擴充與優化,主要有:LongAdder、LongAccumulator、DoubleAdder和DoubleAccumulator,比AtomicLong和AtomicDouble性能更優。
  • CompletableFuture:JDK5中Future的加強版。
  • StampedLock:JDK5中ReadWriteLock的改進版。
相關文章
相關標籤/搜索