線程花絮

---簡單對相關知識做的摘抄和收集--

進程(Process)與線程(Thread)

  • 進程是系統資源分配的最小單元。線程是CPU調度的最小單元。
  • 一個 進程至少包含一個線程,可以包含多個線程。這些線程共享這個進程的資源。
  • 每個線程都擁有獨立的運行棧和程序計數器,線程切換開銷小。
  • 多進程指的是操作系統同時運行多個程序,如當前操作系統中同時運行着QQ、IE、微信等程序。
  • 多線程指的是同一進程中同時運行多個線程,如迅雷運行時,可以開啓多個線程,同時進行多個文件的下載。

並行(Parallel)、併發(Concurrent)與多線程(Multithreading)

  • 並行是指多個任務在同一時刻進行。併發是指多個任務在同一時間段內發生。
  • 並行是物理上的同時發生,而併發是邏輯上的同時發生。
  • 體現在程序上: 並行是指多個CPU內核在同一時刻,同時運行多個任務。併發是指單個CPU內,通過CPU調度算法,讓用戶感覺在同時運行多個任務。
  • 更形象的說法: 並行是指兩隊人員同時使用兩臺咖啡機。併發是指兩隊人員交替使用同一臺咖啡機。—-Erlang 之父 Joe Armstrong。
  • 多線程即多個線程,一般只多個同時在運行的單線程。
  • 如果是在單核CPU上,多線程肯定是併發運行的。如果是在多核CPU上,這些多線程也可能是並行運行。
衆所周知,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的改進版。

java.utils.concurrent

atomic包:提供了原子操作的基本類型還有數組等

原理:volatile關鍵字,naive的cas算法來實現

lock包: 鎖lock、ReentrantLock、ReentrantReadWriteLock中的ReadLock、WriteLock

其他:包含了

1、多線程相關 線程、多線程、線程池、有返回結果的線程、forkjoin

Executor ThreadPoolExecutor 線程池設置類 Executors 四種線程池(ScheduledExecutorService

ExecutorService 線程池管理者

Runnable,Callable,Future,FutureTask

Executor就是Runnable和Callable的調度容器,Future就是對於具體的Runnable或者Callable任務的執行結果進行取消、查詢是否完成、獲取結果、設置結果操作。get方法會阻塞,直到任務返回結果(Future簡介)

FutureTask則是一個RunnableFuture,而RunnableFuture實現了Runnbale又實現了Futrue這兩個接口由於FutureTask實現了Runnable,因此它既可以通過Thread包裝來直接執行,也可以提交給ExecuteService來執行。並且還可以直接通過get()函數獲取執行結果,該函數會阻塞,直到結果返回。因此FutureTask既是Future、Runnable,又是包裝了Callable( 如果是Runnable最終也會被轉換爲Callable ), 它是這兩者的合體。

2、併發集合、ConcurrentHashMap等

3、併發隊列:有界隊列、無屆隊列、阻塞隊列

4.四種多線程的小工具,信號量、屏障、循環屏障

CountDownLatch  協調多個線程的執行順序,等待條件一起執行

CyclicBarrier 柵欄,指定數量的線程到達指定位置一起執行

Exchanger 雙數的線程在某個點交換數據

https://blog.csdn.net/carson0408/article/details/79477280

Semaphore  得到信號量的可以執行,執行完返還信號量 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章