JUC學習筆記(一)
1、什麼是 JUC
1.1、JUC簡介
在 Java 中,執行緒部分是一個重點,本篇文章說的 JUC 也是關於執行緒的。JUC 就是 java.util .concurrent 工具包的簡稱。這是一個處理執行緒的工具包,JDK1.5 開始出現的。
1.2、程序與執行緒
程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系 統進行資源分配和排程的基本單位,是作業系統結構的基礎。 在當代面向執行緒 設計的計算機結構中,程序是執行緒的容器。程式是指令、資料及其組織形式的 描述,程序是程式的實體。是計算機中的程式關於某資料集合上的一次執行活 動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。程式是指令、資料及其組織形式的描述,程序是程式的實體。
執行緒(Thread)是作業系統能夠進行運算排程的最小單位。它被包含在程序之 中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。
**總結來說: **
程序:指在系統中正在執行的一個應用程式;程式一旦執行就是程序;程序— —資源分配的最小單位。
執行緒:系統分配處理器時間資源的基本單元,或者說程序之內獨立執行的一個單元執行流。執行緒——程式執行的最小單位。
1.3、執行緒的狀態
1.3.1、執行緒狀態列舉類
Thread.State
public enum State { /** * Thread state for a thread which has not yet started. */ NEW,(新建) /** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. */ RUNNABLE,(準備就緒) /** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock * to enter a synchronized block/method or * reenter a synchronized block/method after calling * {@link Object#wait() Object.wait}. */ BLOCKED,(阻塞) /** * Thread state for a waiting thread. * A thread is in the waiting state due to calling one of the * following methods: * <ul> * <li>{@link Object#wait() Object.wait} with no timeout</li> * <li>{@link #join() Thread.join} with no timeout</li> * <li>{@link LockSupport#park() LockSupport.park}</li> * </ul> * * <p>A thread in the waiting state is waiting for another thread to * perform a particular action. * * For example, a thread that has called <tt>Object.wait()</tt> * on an object is waiting for another thread to call * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on * that object. A thread that has called <tt>Thread.join()</tt> * is waiting for a specified thread to terminate. */ WAITING,(不見不散) /** * Thread state for a waiting thread with a specified waiting time. * A thread is in the timed waiting state due to calling one of * the following methods with a specified positive waiting time: * <ul> * <li>{@link #sleep Thread.sleep}</li> * <li>{@link Object#wait(long) Object.wait} with timeout</li> * <li>{@link #join(long) Thread.join} with timeout</li> * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li> * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li> * </ul> */ TIMED_WAITING,(過時不候) /** * Thread state for a terminated thread. * The thread has completed execution. */ TERMINATED;(終結) }
1.3.2、wait/sleep區別
- sleep 是 Thread 的靜態方法,wait 是Object 的方法,任何物件例項都 能呼叫。
- sleep 不會釋放鎖,它也不需要佔用鎖。wait 會釋放鎖,但呼叫它的前提 是當前執行緒佔有鎖(即程式碼要在 synchronized 中)。
- 它們都可以被 interrupted 方法中斷。
1.4、併發與並行
1.4.1、序列模式
序列表示所有任務都一一按先後順序進行。序列意味著必須先裝完一車柴才能 運送這車柴,只有運送到了,才能卸下這車柴,並且只有完成了這整個三個步驟,才能進行下一個步驟。
序列是一次只能取得一個任務,並執行這個任務。
1.4.2、並行模式
並行意味著可以同時取得多個任務,並同時去執行所取得的這些任務。並行模式相當於將長長的一條佇列,劃分成了多條短佇列,所以並行縮短了任務佇列的長度。並行的效率從程式碼層次上強依賴於多程序/多執行緒程式碼,從硬體角度上 則依賴於多核CPU。
1.4.3、併發
併發(concurrent)指的是多個程式可以同時執行的現象,更細化的是多程序可以同時執行或者多指令可以同時執行。但這不是重點,在描述併發的時候也不會去扣這種字眼是否精確,併發的重點在於它是一種現象, 併發描述 的是多程序同時執行的現象。但實際上,對於單核心 CPU 來說,同一時刻 只能執行一個執行緒。所以,這裡的"同時執行"表示的不是真的同一時刻有多個 執行緒執行的現象,這是並行的概念,而是提供一種功能讓使用者看來多個程式同 時執行起來了,但實際上這些程式中的程序不是一直霸佔 CPU 的,而是執行一會停一會。
要解決大併發問題,通常是將大任務分解成多個小任務, 由於作業系統對程序的 排程是隨機的,所以切分成多個小任務後,可能會從任一小任務處執行。這可能會出現一些現象:
- 可能出現一個小任務執行了多次,還沒開始下個任務的情況。這時一般會採用 佇列或類似的資料結構來存放各個小任務的成果
- 可能出現還沒準備好第一步就執行第二步的可能。這時,一般採用多路複用或 非同步的方式,比如只有準備好產生了事件通知才執行某個任務。
- 可以多程序/多執行緒的方式並行執行這些小任務。也可以單程序/單執行緒執行這些小任務,這時很可能要配合多路複用才能達到較高的效率
1.4.4、小結
併發:同一時刻多個執行緒在訪問同一個資源,多個執行緒對一個點
例子:春運搶票 電商秒殺...
並行:多項工作一起執行,之後再彙總
例子:泡方便麵,電水壺燒水,一邊撕調料倒入桶中
1.5、管程
管程(monitor)是保證了同一時刻只有一個程序在管程內活動,即管程內定義的操作在同 一時刻只被一個程序呼叫(由編譯器實現).但是這樣並不能保證程序以設計的順序執行
JVM中同步是基於進入和退出管程(monitor)物件實現的,每個物件都會有一個管程 (monitor)物件,管程(monitor)會隨著 java物件一同建立和銷燬
執行執行緒首先要持有管程物件,然後才能執行方法,當方法完成之後會釋放管程,方法在執行時候會持有管程,其他執行緒無法再獲取同一個管程
1.6、使用者執行緒和守護執行緒
使用者執行緒:平時用到的普通執行緒,自定義執行緒
守護執行緒:執行在後臺,是一種特殊的執行緒,比如垃圾回收
當主執行緒結束後,使用者執行緒還在執行,JVM存活
如果沒有使用者執行緒,都是守護執行緒,JVM 結束