理解高併發(2).我對併發編程的理解

對於併發編程, 涉及的技術點非常多, 我們首先需要明確一些基本概念,只有概念清晰,才能做到在以後深入學習關鍵技術的過程中不致於感覺到喫力和迷惑。 其次,我們還需要明白在併發編程最需要關注的問題是什麼? 帶着關鍵問題去學習,才能夠起到事辦功倍、穩紮穩打的效果。
下面是我所總結的一些很多人容易混淆的概念:

1. 高併發、多線程
  • 高併發
高併發是請求,指的是多個客戶端同一時刻向服務端發送請求, 它是一種現象。
比如,電商網站在雙11凌晨12:00分 同時有2000個下單請求。
  • 多線程
多線程是處理,指的是同一時刻多個執行者處理同一類的任務, 它有具體的實現。比如
電商網站在雙11凌晨12:00分同時有100個線程處理2000個下單請求。
2. 並行、併發
  • 並行
多核cpu的情況, 多個任務執行者並行處理任務
  • 併發
單個cpu的情況下,cpu間斷性的執行多個任務。
舉個打掃房間的例子,如果你有1把掃帚需要打掃2個房間, A房間打掃到一半的時候,你再切換到B房間,這就現象稱之爲併發; 如果你有2把掃帚,這個時候就可以同時打掃2個房間了,這種現象稱之爲並行。
3. 多線程就一定效率高嗎?
從上面打掃房間的例子可以看出, 多線程並非效率一定高。 只有在並行的情況下效率才能保證, 併發需要做上下文切換,會影響整體性能。

4. 併發編程需要注意的2個問題
併發編程尤其需要注意的是共享數據的安全性和鎖性能方面的問題, 在併發編程領域的討論中,幾乎90%以上都是圍繞這2大主題展開,甚至jdk每個版本的升級都有針對這2方面問題做優化, 如jdk5之後的各種鎖優化技術、volatile、threadlocal關鍵字等。
  • 共享數據的安全性問題
堆內存和方法區內存可以共享。 因此成員變量和靜態變量存在數據安全性問題。
  • 鎖竟爭帶來的程序效率問題
多個線程訪問共享資源時,只有獲取到鎖的線程才允許訪問共享資源,未獲得到鎖的線程只能在臨界區進行排隊等待,試想如果有1000個線程同時訪問共享資源,那麼最後一個線程必須要等前面999個線程執行完後才能夠進入監界區操作共享資源。
如果鎖沒有控制好,非常容易出現程序整體性能低下的情況。

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