併發:執行緒的優勢及風險
阿新 • • 發佈:2018-12-12
本文參考《java併發程式設計實戰》,java併發必讀書籍
一、執行緒的優勢
1.發揮多處理器的強大能力
一個執行緒對應一個處理器
2.建模的簡單性
通過使用執行緒,可以將複雜並且非同步的工作流進一步分解為一組簡單並且同步的工作流;
每個工作流在一個單獨的執行緒中執行
並在特定的同步位置進行互動
3.非同步事件的簡化處理
在伺服器應用程式在接受多個遠端客戶端的套接字連線請求時:為每個連線都分配獨立的執行緒並且使用同步I/O
降低了開發難度
4.響應更靈敏的使用者介面
傳統的GUI應用程式:主事件迴圈
現代的GUI框架:事件分發執行緒
二、執行緒帶來的風險
1.安全性問題(目標:永遠不發生糟糕的事情)
存在競態條件(Race Condition)時,會產生安全性問題
例如
private int value;
public int getNext() {
return value++;
}
value++
等價於
temp = value;
value = value + 1;
value = temp;
2.活躍性問題(目標:正確的事情最終會發生)
擔心的是:死鎖、飢餓、活鎖(這些不懂得可以關注後續文章)
3.效能問題(目標:正確的事情儘快發生)
執行緒帶來開銷
上下文切換操作開銷:儲存和恢復執行上下文,丟失區域性性,CPU時間更多的花線上程排程而不是執行緒執行上
抑制編譯器優化(比如重排序)