Java併發編程學習筆記—爲什麼要學習併發編程

關於併發編程,無論是面試還是實際項目應用來說都是必不可的一部分。所以也激發了系統學習這塊知識的決心。在參考《併發編程藝術》這本書的情況下,加上學習其他博客/專欄的路線,整理出學習筆記。雖然見解不深,但是相信通過不斷的揣摩和研究,先把基礎夯實。學習是沒有止境的事情,你也不是比別人有多優秀,只是好多人在中途放棄了。

開胃湯:

線程相關的概念:

進程:什麼是進程?在windows的資源管理器中,每個正在運行的exe程序都是一個進程。進程佔用着cpu,內存,磁盤,網絡等資源。站在操作系統的層面上來說進程是分配資源的基本單位,也是最小單位,換種說說法也就是受操作系統管理的基本運行單元。(我們的程序代碼也是進程的一部分)。

線程:可以理解爲進程中獨立的子任務,一個進程中至少存在一條線程。線程是進程中負責程序執行的執行單元,也就是實際功能的執行者。舉個例子:看直播的時候,可以看直播的時候發送彈幕,還可以參與抽獎。而每個功能執行的背後都是通過線程來執行。那麼多個任務同時執行也就是常說的多線程。

串行:多個程序在一個CPU上排隊執行,比如在電影院買票,只有一個窗口,大家按部就班的排隊買票(單核CPU上執行程序)

並行:多個程序同時在多個CPU上執行。還是買票的例子,買票的人太多了,電影院又開了幾個窗口同時買票,效率高了不少。

併發:多個程序在一個CPU上運行,CPU在多個程序之間快速切換,微觀上不是同時運行,任意一個時刻只有一個程序在運行,但宏觀上看起來就像多個程序同時執行。電影院的例子:電影院增加改簽服務,同時售票員get一像新技能,即能同時賣票,在出票的同時還能辦理改簽業務。

同步:在發出一個調用時,在沒有得到結果之前,該調用就不返回。栗子:在電影院買票的同時,你得等到票出來了才能離開。 異步:在發出一個異步調用後,調用者不會立刻得到結果,該調用就返回了。栗子:退票,售票員處理後,錢會直接退回到你支付寶裏,你不用等着領了錢再走。

說了那麼多概念以後,終極問題來了,爲什麼要使用多線程?

總結出來就是了爲了提高程序運行的效率,提高資源的利用率。

舉個例子:在單核CPU下執行兩個任務,一個需要執行10秒,一個需要執行1秒,在單線程的環境下,兩個任務執行完成需要11秒。而在多線程的環境下,線程通過上下文的快速切換,在10秒任務線程等待期間,釋放CPU,1秒任務線程獲得CPU的使用權執行完畢,然後釋放CPU的使用權,10秒任務繼續執行,直到結束。兩個任務總執行時間是10秒。相比單線程情況下,效率提高了1秒,CPU得到了更充分的利用。這是多線程的優點,也是爲什麼會使用多線程技術。

這種肉眼可見的同時進行,其實並不是真正的同時進行,只是線程之間的切換速度很快,看似同時進行。

不過隨着硬件的發展,動輒就八核甚至更多核的CPU越來越普及,多線程帶來的優勢越來越明顯,同時併發場景下帶來的問題也越來越棘手。那麼併發問題的源頭到底是什麼原因呢?開胃湯喝完,要上第一道菜了。這也是接下來要的開味大菜之一。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章