技術日志
并發編程的歷史
真空管/穿孔打卡
晶體管/批處理操作系統
集成電路/多道程序設計
- 為什么需要線程
1.單核-多核心-真正意義上的并行
2.實時性需求-線程
JAVA中如何應用線程
1.Runnable接口
2.thread類(本質上是對Runnable接口的實現)
3.Callable/Futere
4.ThreadPool
實際應用
線程池
1.new Thread
怎么應用?
BIO模型的優化
例1:socket.accept()連接阻塞
例2:scoket.inputstream() 讀阻塞
線程在java中的應用
并發基礎
生命周命周期
線程的鎖
資源競爭造成數據安全問題
線程安全本質上是管理數據狀態的訪問
鎖的升級過程是不能降級的
互斥鎖
1.synchroized
最初為重量級鎖,1.6以后做了優化(偏亮鎖)
- 既要保證線程安全,也要保證性能
偏向鎖
分析會出現使用鎖的場景
假如有線程A和線程B,會出現的情況為:
1.只有線程A去訪問——大多數情況屬于這種,所以引入了偏向鎖
2.線程A和線程B交替執行-> 輕量級鎖-》自旋
3.多個線程同時訪問->阻塞
輕量級鎖
什么是自旋
1.就是一個循環來獲取鎖
for(;;){
if(cas){
執行代碼
}
}
2.自旋會占用cpu資源,所以在指定了自旋的次數之后還沒有獲取鎖資源,會出現鎖膨脹,會膨脹為重量級——> 重量級鎖
3.可以設置自旋次數
4.可以自適應自旋:判斷上次自旋次數,本次跟上次一樣
重量級鎖
重量級鎖的執行過程:

線程之間的通信
- wait
第一個實現線程的阻塞,第二個是會釋放當前當前的同步鎖
- notify
喚醒被阻塞的一個線程,如果有多個阻塞的線程,會隨機喚醒一個
- notifyall
1.通信原理圖

wait會釋放鎖的資源,sleep不會釋放cpu和鎖的資源
多線程的實際應用場景
解決并發計算問題
線程的生命周期
線程的六種狀態
創建(new)-start-[就緒(ready)-運行(runnable)]-終止(terminated)
運行狀態詳解:
1.ready
2.runnable
3.blocked(只有鎖等待時候出現)
4.waiting(wait,join,sleep,lockSupport.park)
5.為什么創建線程是start方法
start方法調用了native本地方法,使用本地方法調用了os的線程的創建線程并調用run方法
5.time_waiting(按時間等待)
線程的基本操作-啟動/停止
線程的中斷和復位
線程的終止是什么?
thread.interrput()方法,本方法也是一個本地方法,調用的jvm_interrputs
線程復位可以使用interrputedexception6.線程的終止是什么?
thread.interrput()方法,本方法也是一個本地方法,調用的jvm_interrputs
線程復位可以使用interrputedexception