《Java併發編程實戰》讀書筆記-第1章 簡介

併發簡史

在早期的計算機中不包含操做系統,從頭到尾都只執行一個程序,而且這個程序能訪問計算機全部資源。操做系統的出現使得計算機每次能運行多個程序,而且不一樣的程序都在單獨的進程中運行:操做系統爲各個獨立執行的進程分配內存、文件句柄、安全證書等。不一樣進程之間經過一些粗粒度的通訊機制交換數據,包括:套接字、信號處理器、共享內存、信號量以及文件等。
之因此在計算機中加入操做系統來實現多個程序同時執行,主要基於如下緣由:緩存

資源利用率:在某些狀況下,程序若是在等待某個外部操做執行完成的同時,能夠運行另外一個程序,那無疑將提升資源的利用率。
公平性:經過粗粒度的時間分片運行方式,使得不一樣的用戶和程序對於計算機上的資源有着共同的使用權。
便利性:計算多個任務時,編寫多個程序,每一個程序執行一個任務並在必要時相互通訊,比之編寫一個程序來計算全部任務更容易實現。

這些促使進程出現的因素一樣也促使着線程的出現。線程容許同一個進程中同時存在多個程序控制流。線程會共享進程範圍內的資源(內存、文件句柄),但每一個線程都有各自的程序計數器、棧、局部變量等。一個程序中的多個線程也能夠同時被調度到多個CPU上運行。安全

線程也被稱爲輕量級進程。現代操做系統中,都是以線程爲基本的調度單位,而不是進程。多線程

線程的優點

發揮多處理器的強大能力
建模的簡單性
異步事件的簡化處理
響應更靈敏的用戶界面

線程帶來的風險

安全性問題
多個線程同時訪問和修改相同的變量時,會發生沒法預料的數據變化,致使線程出現錯誤併發

活躍性問題
當某個操做沒法繼續執行下去時:死鎖、飢餓、活鎖異步

性能問題
多線程程序中不只存在於單線程程序相同的性能問題(服務時間過長、響應不靈敏、吞吐率太低、資源消耗太高、可伸縮行較低等),並且還存在因爲使用線程而引入的其餘性能問題:性能

在多線程程序中,當線程調度器臨時掛起活躍線程並轉而運行另外一個線程時,會頻繁的出現上下文切換操做(Context
Switch),這種操做將帶來極大的開銷:保存和恢復執行上下文,丟失局部性,CPU花更多的時間在線程調度而不是線程運行上。
使用同步機制操做共享數據時,會抑制編譯器優化,是內存緩存區中的數據無效,以及增長共享內存總線的同步流量優化

相關文章
相關標籤/搜索