從一個單線程的應用到一個多線程的應用並不單單帶來好處,它也會有一些代價。不要僅僅爲了使用多線程而使用多線程。而應該明確在使用多線程時能多來的好處比所付出的代價大的時候,才使用多線程。若是存在疑問,應該嘗試測量一下應用程序的性能和響應能力,而不僅是猜想。數據結構
設計更復雜
- 雖然有一些多線程應用程序比單線程的應用程序要簡單,但其餘的通常都更復雜。在多線程訪問共享數據的時候,這部分代碼須要特別的注意。
線程之間的交互每每很是複雜。不正確的線程同步產生的錯誤很是難以被發現,而且重現以修復。多線程
上下文切換的開銷
- 當CPU從執行一個線程切換到執行另一個線程的時候,它須要先存儲當前線程的本地的數據,程序指針等,而後載入另外一個線程的本地數據,程序指針等,最後纔開始執行。這種切換稱爲「上下文切換」(「context switch」)。CPU會在一個上下文中執行一個線程,而後切換到另一個上下文中執行另一個線程。
- 上下文切換並不廉價。若是沒有必要,應該減小上下文切換的發生。
增長資源消耗
- 線程在運行的時候須要從計算機裏面獲得一些資源。除了CPU,線程還須要一些內存來維持它本地的堆棧。
它也須要佔用操做系統中一些資源來管理線程。咱們能夠嘗試編寫一個程序,讓它建立100個線程,這些線程什麼事情都不作,只是在等待,而後看看這個程序在運行的時候佔用了多少內存。併發
小結
- 使用多線程的目的是爲了提升效率,時效性,達到「物盡其才,人盡其用」,但卻增長了維護成本(固然大公司不在意這一點錢罷了),排錯難度,對數據結構,數據併發控制也有必定影響。