Java并發概念匯總

jopen 9年前發布 | 59K 次閱讀 Java開發 java并發

看了《Java編程思想 第4版》并發這一章,覺得有必要整理一下其中的概念。

并發

為什么要并發? 比如因為IO操作遇到了阻塞,CPU可以轉去執行其他線程,這時并發的優點就顯示出來了:更高效的利用CPU,提高程序的響應速度。

Java的線程機制是搶占式的,會為每個線程分配時間片。

線程中斷與上下文切換

并發編程 - 多線程的代價及上下文切換
上下文切換與多處理器

Java本身還有另外一個“線程中斷”

詳細分析Java中斷機制

基本的線程機制

使用Runnable和Thread創建線程:

Defining and Starting a Thread
“implements Runnable” vs. “extends Thread”

使用執行器Executor執行線程:

并發新特性—Executor框架與線程池(含代碼)
Java線程(六):線程池
Interface Executor

讓線程中的任務返回值:Callable

Java線程(七):Callable和Future
Java Callable Future Example

休眠sleep()、讓步yield()

休眠(sleep)和讓步(yield)會導致線程阻塞,CPU轉而執行其他線程。對調用yield時,是在建議具有相同優先級的其他線程運行。

java之yield(),sleep(),wait()區別詳解

線程優先級、后臺線程

關于Java的Daemon線程的理解
JAVA并發編程——守護線程(Daemon Thread)
Java多線程系列--“基礎篇”10之 線程優先級和守護線程
java 線程的優先級Priority

join()

簡談Java的join()方法
Java多線程中join方法的理解

捕獲線程的異常

JAVA 線程中的異常捕獲

共享受限資源

Java線程安全和非線程安全

synchronized

Java線程(二):線程同步synchronized和volatile
What does 'synchronized' mean?

重入鎖ReentrantLock

Java線程(八):鎖對象Lock-同步問題更完美的處理方式
Java 理論與實踐: JDK 5.0 中更靈活、更具可伸縮性的鎖定機制

java鎖的種類以及辨析(一):自旋鎖
Java鎖的種類以及辨析(二):自旋鎖的其他種類
Java鎖的種類以及辨析(三):阻塞鎖
Java鎖的種類以及辨析(四):可重入鎖

Volatile變量

Java 理論與實踐: 正確使用 Volatile 變量
聊聊并發(一)——深入分析Volatile的實現原理

CAS

JAVA CAS原理深度分析

原子類

Java 理論與實踐: 流行的原子
Java多線程(二)之Atomic:原子變量與原子類

臨界區(critical section)

競態條件與臨界區

線程本地存儲ThreadLocal

Java線程(篇外篇):線程本地變量ThreadLocal
徹底理解ThreadLocal
Class ThreadLocal
Java ThreadLocal
When and how should I use a ThreadLocal variable?

終結任務

線程狀態

一張圖讓你看懂JAVA線程間的狀態轉換
Life Cycle of Thread – Understanding Thread States in Java
Java 6 Thread States and Life Cycle

中斷線程

詳細分析Java中斷機制
What does java.lang.Thread.interrupt() do?

如何停止線程

stop()方法已經被廢棄了。

如何停止一個正在運行的java線程
How to stop a java thread gracefully?

線程協作

wait()、notify()、notifyAll()

阻塞是進程在等待某種資源,但是不能馬上得到,必須等待別的進程釋放資源才能繼續,屬于被動無法得到時間片,內核就切換其它進程運行
休眠一般為主動式的放棄一段CPU時間。
掛起是運行時間片到了,內核要調度其它進程運行,被動式的失去CPU。(掛起可以被別的進程給搶占導致掛起,也可以自己主動掛起自己。)

</blockquote>

wait()會在等待時將當前任務掛起,等到notify()/notifyAll()發生時,任務才被喚醒。

調用sleep()、yield()時不會釋放鎖;調用wait()時線程被掛起,對象上的鎖也會被釋放。

wait()、notify()、notifyAll()屬于類Object,不屬于Thread。

只能在同步控制方法或者同步控制塊(synchronized)中調用wait()、notify()、notifyAll()。而sleep()、yield()可以在非同步控制方法里使用。

notifyAll()比notify()更安全一些。使用notify()時,眾多等待同一個鎖的任務中只有一個會被喚醒。

Java Thread wait, notify and notifyAll Example

Lock和Condition

Java線程(九):Condition-線程通信更高效的方式

死鎖

哲學家就餐問題
一個 Linux 上分析死鎖的簡單方法、死鎖的4個必要條件
什么是死鎖,死鎖的四個必要條件以及處理死鎖的策略
如何避免死鎖

類庫中的其他構件

CountDownLatch

CountDownLatch,閉鎖。

首先給該對象一個初始計數值,每個在該該對象上調用await()的任務會阻塞。當計數值到0時,所有因為await()而阻塞的任務都繼續執行。

Java CountDownLatch應用
CountDownLatch
Java多線程系列--“JUC鎖”09之 CountDownLatch原理和示例

CyclicBarrier

CyclicBarrier,關卡,柵欄。

CountDownLatch和CyclicBarrier的區別 (01) CountDownLatch的作用是允許1或N個線程等待其他線程完成執行;而CyclicBarrier則是允許N個線程相互等待。 (02) CountDownLatch的計數器無法被重置;CyclicBarrier的計數器可以被重置后使用,因此它被稱為是循環的barrier。

</blockquote>

Java多線程系列--“JUC鎖”10之 CyclicBarrier原理和示例
CyclicBarrier

BlockingQueue

Interface BlockingQueue
聊聊并發(七)——Java中的阻塞隊列

DelayQueue

Examples of DelayQueue in Java
精巧好用的DelayQueue

Timer和TimerTask

這兩個在java.util這個包下面。

Timer和TimerTask可以做為實現線程的第三種方式,前兩種方式分別是繼承自Thread類和實現Runnable接口。

</blockquote>

Java線程(五):Timer和TimerTask

ScheduledThreadPoolExecutor

Java ScheduledThreadPoolExecutor延遲或周期性執行任務
Class ScheduledThreadPoolExecutor

信號量Semaphore

Java 信號量 Semaphore 介紹
Java Concurrency Tutorial – Semaphores

Exchanger

用于兩個線程之間交換數據。

Java線程之Exchanger

性能調優

使用Lock通常比sychronized高效,sychronized的開銷看起來變化范圍很大,Lock相對一致。synchronized產生的代碼,與Lock所需要的“加鎖-try/finally-解鎖”相比,可讀性更高。

</blockquote>

CopyOnWriteArrayList、CopyOnWriteArraySet

在該類的對象中,寫入將導致創建整個底層數組的副本,而原數組保留在原地,使得復制的數組在被修改時,讀取操作可以安全的執行。當對副本的修改完成時,會發生一個原子性的操作:用副本替換源數組,使得新的讀取操作可以看到這個新的修改。

Class CopyOnWriteArrayList
Java copy-on-write collections
Java多線程系列--“JUC集合”03之 CopyOnWriteArraySet

ConcurrentHashMap、ConcurrentLinkedQueue

聊聊并發(四)——深入分析ConcurrentHashMap
聊聊并發(六)——ConcurrentLinkedQueue的實現原理分析
Class ConcurrentHashMap
Class ConcurrentLinkedQueue

樂觀鎖

悲觀鎖與樂觀鎖
樂觀并發控制
Concurrency control
Optimistic concurrency control

讀寫鎖ReadWriteLock

適合讀多寫少的場景。

Java中的讀/寫鎖
Java ReadWriteLock Example
ReadWriteLock

生產者消費者問題

Java線程(三):線程協作-生產者/消費者問題

其他

Java并發的四種風味:Thread、Executor、ForkJoin和Actor
Java Thread and Multithreading Tutorial
JAVA 多線程和并發基礎面試問答
Java Multi-Threading and Concurrency Interview Questions with Answers
Monitor (synchronization) 聊聊并發

來自:http://www.letiantian.me/2015-05-27-java-concurrency-summary/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!