併發編程簡介web
與串行程序開發相比,併發編程的難度更大,編寫、調試、維護都很困難,致使不少開發人員圖省事放棄併發編程。可是如今已經進入了多核移動互聯時代,如今連入門級的手機都是多核的,因此如何充分發揮多核處理器系統的強大的計算能力,是咱們每一個開發人員須要面對的。編程
1、併發的歷史緩存
1.串行時代安全
串行執行的特色服務器
每次只能運行一個程序,只有其執行完成其餘程序才能開始執行。多線程
這種方式人類流水線的工做方式,其優點在於直觀性和簡單性。併發
串行執行的缺點異步
資源利用率低,單個程序執行不能有效率用cpu資源,尤爲是其進行長時間IO操做的狀況下。性能
缺少公平性,不一樣用戶和計算機不能同等的使用計算機資源。優化
缺少靈活性,一個複雜的業務系統須要完成多個大的任務,每每須要垂直切分爲多個業務系統更好實現。
2.進程時代
咱們發現生活中人們老是能夠在串行和異步之間進行並行權衡達到優雅高效作事。例如人們每每在煮粥的同時,能夠摘菜、洗菜、切菜,待菜準備好的時候,可能粥也就煮好了,這時候正好能夠炒菜。
因此爲了解決串行編程的缺點,操做系統出現了。
進程執行的特色
能夠同時執行多個程序,可是每一個程序在單獨的進行中執行。
每一個進程分配單獨的資源,例如內存、文件句柄等。
不一樣進程之間能夠經過套接字、信號量等進行交換數據。
3.線程時代
線程執行的特色
線程共享父進程內的資源,例如內存句柄、文件句柄等,須要同步共享數據的訪問,防止發生不可預測的結果。
每一個線程都有本身的程序計數器、堆棧、局部變量等。
現代操做系統以線程爲基本調度單位,線程能夠不一樣的cpu上進行調度執行。
2、線程的優點
1.充分利用多(核)處理器的計算能力。
隨着移動設備的普及,多核設備隨處可見,多線程程序能夠提升處理器的資源利用率。
即便多線程在單處理器上也能夠經過異步提升IO密集型操做的性能。
2.建模簡單
一個程序每每會包含不少不一樣類型的任務,不少時候每每能夠爲不一樣的任務分配不一樣的線程進行處理。好比在ASP.NET中,每一個請求都是由某個線程處理的,同時GC在另外的線程上負責垃圾回收。
3.簡化異步處理
web服務器接受客戶端請求,若是爲每一個連接分配線程並使用同步IO,這樣會嚴重下降併發能力。
單線程是很難實現異步IO的,經過多線程能夠很方便的實現同時處理大量的IO請求。
4.UI界面響應更友好
UI界面每每在單獨的線程中執行,代碼邏輯在另外的線程中運行。
3、多線程的風險
1.安全性問題
因爲線程執行順序的不可預測性,若是沒有進行充足同步的狀況下,每每會因爲對共享數據的無序操做,致使不可預知的結果。好比對共享數據value的訪問,可能會致使多個線程獲取到相同的value。
2.活躍性問題
活躍性問題每每是爲了保證數據的安全性問題,對線程的執行順序加以限制,從而致使活躍性的問題,好比死鎖、飢餓、活鎖等。
3.性能問題
活躍性問題會致使性能問題;
多線程須要運行時開銷,例如上下文切換、數據同步機制致使緩存失效和編譯器優化失效。