Basic Of Concurrency(一:如何理解多線程)

什麼是多線程?

單任務,單cpu時代,一個時間點僅能運行單一程序,程序能夠獨佔資源.html

多任務,單cpu時代,一個時間點可以運行多個程序,程序必須共享資源.然而這並非真正意義上的運行多個程序.而是統一由操做系統爲多個程序分配cpu運行時間片,讓cpu在不一樣的任務中切換運行.java

多任務,單cpu對開發者設計軟件時提出了新的挑戰,即假設程序不使用計算機資源後須要當即釋放資源,以供其餘程序使用,提高計算機資源利用率.編程

然後發展至多線程技術,即讓一個程序內部擁有多個線程並行執行,並行程度取決於cpu的核心以及線程數量.不一樣的線程有可能被分配到不一樣的cpu上執行,所以一個程序運行在多線程下,即可以被多個cpu同時執行.網絡

多cpu多線程相較於多任務對開發者設計軟件時提出了更加苛刻的挑戰,多線程帶來的問題在以往單cpu時代聞所未聞.多線程在同一程序內並行執行,形成比較直觀的問題是會產生併發的讀寫操做,且順序隨機,對其產生的輸出結果徹底沒法預估.多線程

併發的讀寫問題僅會在一個讀一個寫或兩個寫操做並行執行的場景下產生.如一個線程往內存中讀取數值,另外一個線程往內存中寫數值,兩個線程執行完畢後沒法預估讀線程讀取到的數值究竟是更新前的數值仍是更新後的數值,或是兩個數值的混合體.兩個寫操做也一樣如此,是第一個寫操做寫入的值仍是第二個寫操做寫入的值,或是兩個寫操做的混合值.併發

多線程的優勢

一般網絡/磁盤io比cpu和內存運算慢得多,利用這一點,能夠在程序等待io時,儘量的利用cpu作其餘事情,提高資源利用率.post

對沒有狀態共享行爲的任務,多線程有利於編寫處理程序和提高處理速度.如對多個文本文件中的相同字符出現次數進行統計,能夠利用多線程對多個文本文件分別進行統計再累計全部線程統計出來的數目獲得最終的統計值.性能

利用多線程能夠設計出響應速度更快的程序.對於擁有界面的應用,能夠利用1+n的線程模式,讓一個線程負責響應界面事件和接收事件處理結果,多個界面事件將在線程池中去處理,處理完畢後再將結果傳遞給界面線程.以此來達到提高程序響應速度的效果.操作系統

多線程的缺點

tips: 應該多測量一下應用程序的性能和響應能力(硬件性能+軟件性能綜合決定了應用的性能,軟件性能對應用綜合性能的影響較大).線程

多線程在涉及到狀態共享時,對程序的設計將變得十分複雜.須要對程序施加必定的同步措施,且不正確的同步措施將會帶來不可預期的結果,因此對開發人員多線程編程技能的掌握程度要求較高.

多線程的切換必定程度上須要更換本地的上下文數據,即在運行下一個線程時須要暫存上一個線程的執行數據.頻繁的上下文切換必然會形成資源浪費.如無必要,儘可能不讓線程進行上下文切換.

計算機中讓多個線程保持活躍必然須要必定的資源,即須要必定的內存來維持每一個線程的堆棧信息.也須要操做系統調配必定的資源來管理線程.大量無用且活躍的線程會佔用大量的計算機資源.

該系列博文爲筆者複習基礎所著譯文或理解後的產物,複習原文來自Jakob Jenkov所著Java Concurrency and Multithreading Tutorial

下一篇: 建立和啓動線程

相關文章
相關標籤/搜索