【Java併發編程的藝術】第一章讀書筆記

前言

併發編程的目的是讓程序跑的更快,但並非啓動更多的線程,這個程序就跑的更快。有如下幾種挑戰。算法

挑戰及方案

上下文切換

單核CPU上執行多線程任務,經過給每一個線程分配CPU時間片的方式來實現這個機制。時間片是CPU分配給每一個線程運行的時間,時間片很是短,CPU經過不斷的切換線程執行,給咱們人類留下的印象就是多個線程在同時執行。數據庫

因爲線程有建立和上下文切換的開銷,當整個程序內部操做數不高的狀況下,併發執行可能比串行執行來的慢。編程

儘量下降上下文切換的次數,有助於提升併發效率。多線程

  1. 無鎖併發編程。書中提到多線程競爭鎖時會發生上下文切換,因此竟可能避免使用鎖==書中指的應該是爲了競爭鎖而觸發的搶佔式上下文切換,由於平常多線程運行也須要上下文切換==,能夠經過不一樣線程處理不一樣分段的數據來下降。
  2. CAS算法。Java中的Atomic包使用CAS算法來更新數據,不須要加鎖==CAS算法目前還不是很瞭解==
  3. 使用最少線程。
  4. 協程。協程,又稱微線程,纖程。英文名Coroutine。指的是在單線程裏面實現多任務的調度==以前在Python和Go裏面聽過這個概念,不過還沒作具體瞭解。==

死鎖

併發編程中的另外一挑戰是死鎖,會形成系統功能不可用。死鎖是指兩個或兩個以上的進程或者線程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一種阻塞的現象。併發

避免死鎖的常見方法:高併發

  1. 避免一個線程同時獲取多個鎖。
  2. 儘量保證一個鎖內只佔有一個資源。
  3. 嘗試使用定時鎖。

資源限制的挑戰

好比說帶寬只有2Mb/s,你下載速度是1Mb/s,開10個線程速度也不會變成10Mb/s。書中提到在併發編程時須要考慮到資源上的限制。若是受制於資源,好比我數據庫鏈接數就10個,你每次用完都新建線程來作鏈接,總體程序的速度確定會慢下來。線程

解決的方法有如下幾點:協程

  1. 對於硬件資源的限制,可使用集羣來跑。
  2. 對於軟件資源上的限制,能夠複用資源,好比複用數據庫鏈接。

根據資源的限制,靈活的去調整併發度。進程

相關文章
相關標籤/搜索