Java并發概念匯總
看了《Java編程思想 第4版》并發這一章,覺得有必要整理一下其中的概念。
并發
為什么要并發? 比如因為IO操作遇到了阻塞,CPU可以轉去執行其他線程,這時并發的優點就顯示出來了:更高效的利用CPU,提高程序的響應速度。
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方法的理解
捕獲線程的異常
共享受限資源
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 理論與實踐: 流行的原子
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()
阻塞是進程在等待某種資源,但是不能馬上得到,必須等待別的進程釋放資源才能繼續,屬于被動無法得到時間片,內核就切換其它進程運行
</blockquote>
休眠一般為主動式的放棄一段CPU時間。
掛起是運行時間片到了,內核要調度其它進程運行,被動式的失去CPU。(掛起可以被別的進程給搶占導致掛起,也可以自己主動掛起自己。)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原理和示例
CyclicBarrierBlockingQueue
Interface BlockingQueue
聊聊并發(七)——Java中的阻塞隊列DelayQueue
Examples of DelayQueue in Java
精巧好用的DelayQueueTimer和TimerTask
這兩個在java.util這個包下面。
Timer和TimerTask可以做為實現線程的第三種方式,前兩種方式分別是繼承自Thread類和實現Runnable接口。
</blockquote>ScheduledThreadPoolExecutor
Java ScheduledThreadPoolExecutor延遲或周期性執行任務
Class ScheduledThreadPoolExecutor信號量Semaphore
Java 信號量 Semaphore 介紹
Java Concurrency Tutorial – SemaphoresExchanger
用于兩個線程之間交換數據。
性能調優
使用Lock通常比sychronized高效,sychronized的開銷看起來變化范圍很大,Lock相對一致。synchronized產生的代碼,與Lock所需要的“加鎖-try/finally-解鎖”相比,可讀性更高。
</blockquote>CopyOnWriteArrayList、CopyOnWriteArraySet
在該類的對象中,寫入將導致創建整個底層數組的副本,而原數組保留在原地,使得復制的數組在被修改時,讀取操作可以安全的執行。當對副本的修改完成時,會發生一個原子性的操作:用副本替換源數組,使得新的讀取操作可以看到這個新的修改。
Class CopyOnWriteArrayList
Java copy-on-write collections
Java多線程系列--“JUC集合”03之 CopyOnWriteArraySetConcurrentHashMap、ConcurrentLinkedQueue
聊聊并發(四)——深入分析ConcurrentHashMap
聊聊并發(六)——ConcurrentLinkedQueue的實現原理分析
Class ConcurrentHashMap
Class ConcurrentLinkedQueue樂觀鎖
悲觀鎖與樂觀鎖
樂觀并發控制
Concurrency control
Optimistic concurrency control讀寫鎖ReadWriteLock
適合讀多寫少的場景。
Java中的讀/寫鎖
Java ReadWriteLock Example
ReadWriteLock生產者消費者問題
其他
Java并發的四種風味:Thread、Executor、ForkJoin和Actor
來自:http://www.letiantian.me/2015-05-27-java-concurrency-summary/
Java Thread and Multithreading Tutorial
JAVA 多線程和并發基礎面試問答
Java Multi-Threading and Concurrency Interview Questions with Answers
Monitor (synchronization) 聊聊并發