###第一章 Java多線程技能編程
使用Java多線程兩種方式。
繼承Thread類與實現Runnable接口。多線程
線程的開始、停止、暫停、恢復、中止。
start()
、interrupt()
、suspend()
、resume()
、stop()
併發
線程的id
、name
、優先級priority
、守護daemon
。
線程的id
由內部自增字段維護,默認的name
也是如此。優先級priority
沒有強迫性。deamon
表示本線程是否守護主線程。this
線程的sleep
、yield
、wait
區別。
sleep
不釋放鎖,不放棄當前CPU資源。yield
不釋放鎖,放棄CPU資源。wait
是釋放鎖,並放棄CPU資源。線程
線程跳出執行的方法。
可以使用「異常法」,在同步代碼中根據線程是否interrupted
,拋出異常,這樣中斷的消息能夠有調用棧中傳遞。調試
###第二章 對象及變量的併發訪問code
synchronized
同步方法與同步代碼塊。
同步方法與同步代碼塊相似,鎖定的是this
對象。對象
鎖同步對象爲實例與類的區別。
實例對象鎖定的是實例對象,類鎖定的是類對象。繼承
String
爲鎖的特性。
String
對象有常量池,全部鎖定同一個字面量的String
對象,是同一個對象鎖。接口
synchronized
與volatile
。
volatile
主要做用是使變量在多線程間可見。而synchronized
是保證多線程的同步性,同時有也有可見性。
volatile
的非原子性。
volatile
不具有同步性,也不具有原子性。
Atomic
相關類。
相關類保證了原子性,可是沒有同步性,類的每一個方法之間調用不是原子性的。
同步方法的非繼承、異常自釋放,髒讀。
同步方法不會繼承同步性,出現異常會自動釋放鎖,在多線程狀況下,可能會讀到已經被修改的值。
###第三章 線程間通訊
Object
中等待與通知的鎖模型。
調用wait()
方法,當前線程釋放鎖,會在wait()
代碼中止執行,直到中斷或接到通知。調用notify()
方法會在線程退出同步體後釋放鎖,並通知其餘在等待對象鎖的線程。
生產者與消費者模式。
管道進行線程通訊。
經過字節流與字符流也可用於不一樣線程以前的通訊。
Thread
中join
方法實現機制。
使用join()
可讓主線程等待子線程執行完成以前再結束。內部實現機制是讓主線程的進入子線程的join()
方法,而後等待。由於join()
是同步方法,沒人通知,因此會無限期阻塞,直到子線程銷燬。
ThreadLocal
線程隔離的實現機制。
ThreadLocal
可讓線程持有線程獨有的變量,內部原理是Thread
類中有一個Map
,存儲着全部ThreadLocal
變量,以ThreadLocal
字段實例爲Key
。全部不一樣的線程會有不一樣的ThreadLocal
變量值。
ReentrantLock
與synchronized
的對比。
lock()
與unlock()
方法對對應synchoronized
的同步區。
Condition
與Object
中的鎖模型對比。
await()
對應wait()
,signal()/signalAll()
對應notify()/notifyAll()
。
公平鎖與非公平鎖。
公平鎖表示獲取鎖是按加鎖的順序分配的,也就是FIFO,非公平鎖就是按隨機獲取。
tryLock()
、awaitUntil()
等獨有方法。
tryLock()
做用是隻有在沒其餘線程持鎖的狀況纔去獲取鎖。awaitUntil()
是指等待到某個時間點。
ReentrantReadWriteLock
的讀寫排斥規則。
讀寫鎖的規則是讀讀共享,寫寫互斥,讀寫互斥,寫讀互斥。
定時器過時調度規則。
當計劃時間早於當前時間時,定時器會馬上執行,若是晚於當前時間,會等待到計劃時間再執行。
scheduleAtFixedRate()
的間隔時間規則與過時補償調度。
scheduleAtFixedRate()
與schedule()
方法不一樣,一是在計算下次執行時間,後者是本次任務的開始時間+時間間隔得出,前者是使用嚴格按初始時間+時間間隔得出,因此當前時間比計劃時間要晚的時間,調試器會「補上」從初始時間到當前時間沒有執行的任務。
六種單例模式。
有經典餓漢模式、靜態代碼塊模式、靜態內部類模式、枚舉模式、經典懶漢模式、DCL同步代碼模式。
懶漢模式與可能出現的同步問題及解決方法。
懶漢模式就是延遲加載,但在多線程情景下,可能會出現多個實例。可使用synchronized
同步方法,或者用雙重檢查鎖機制解決這個問題。
線程六種狀態,和狀態之間的轉換。
線程有NEW
、RUNNABLE
、BOLOCKED
、WAITING
、TIMED_WAITING
、TERMINATED
六種狀態。
線程組相關知識:自動歸屬、多級關聯、中止等。
當線程建立時,若是沒有指定所屬線程組,他會自動歸屬到當前線程所在的線程組。線程組以前能夠多級關聯造成線程樹。
線程與線程組異常處理。
線程與線程組可以使用UncaughtExceptionHandler
與uncaughtException
處理相關的異常,沒必要在run()
中處理。若是run()
中有try-catch
,uncaughtException
就不會被調用。