《Java多執行緒程式設計實戰》——第1章 Java多執行緒程式設計實戰基礎
阿新 • • 發佈:2018-12-04
Java執行緒:
- 守護執行緒——不影響JVM的正常停止,常用於執行一些重要性不太高的任務
- 使用者執行緒——
建立一個Thread例項與建立其他類例項的區別:
JVM為Thread例項分配兩個呼叫棧所需的儲存空間:
- 跟蹤Java程式碼間的呼叫關係
- 跟蹤Java程式碼對原生代碼(Native程式碼)的呼叫關係
一個Thread例項通常對應兩個執行緒:
- JVM執行緒
- 本地(Native)執行緒
Java語言中,子執行緒是否是一個守護執行緒取決於父執行緒:預設與父執行緒相同。可以在子執行緒啟動前呼叫Thread例項的setDaemon方法來修改。
Java執行緒的狀態:
- New:新建未啟動
- RUNNABLE: READY && RUNNING
- BLOCKED:阻塞式I/O或試圖獲取一個其他執行緒持有的鎖
- WAITING: Object.wait()、Thread.join()和LockSupport.park()
Object.notify()、Object.nodifyAll()和LockSupport.unpart(thread) - TIMED_WAITING:與WAITING類似,但是有時間限制
- TERMINATED:已經執行結束
上下文切換
儲存執行緒上下文(包括CPU暫存器和程式計數器內容等),恢復執行緒上下文
上下文切換會帶來額外的開銷,這包括:
- 儲存和恢復執行緒上下文資訊的開銷
- 對執行緒進行排程的CPU時間開銷
- CPU快取內容失效的開銷
synchronized:
- 通過該關鍵字所包括的臨界區的排他性保證在任何一個時刻只有一個執行緒能夠執行臨界區的程式碼。
- 保證操作的原子性和記憶體可見性。
- 會導致上下文切換。
volatile:
- 寫入主存,且緩衝區的緩衝失效,保證操作的可見性。
- 禁止指令重排序。
多執行緒優勢:
- 提高系統吞吐率
- 提高響應性
- 充分利用多核CPU資源
- 最小化對系統資源的使用
- 簡化程式的結構
多執行緒風險:
- 執行緒安全問題
- 死鎖、活鎖、飢餓問題
- 上下文切換
- 可靠性