1. 程式人生 > >java高併發(一)—幾個概念

java高併發(一)—幾個概念

幾個概念

  1. 同步(synchronous)和非同步(asynchronous)

(1)同步互動:指傳送一個請求,需要等待返回,然後才能夠傳送下一個請求,有個等待過程;
(2)非同步互動:指傳送一個請求,不需要等待返回,隨時可以再發送下一個請求,即不需要等待。
區別:一個需要等待,一個不需要等待,在部分情況下,我們的專案開發中都會優先選擇不需要等待的非同步互動方式。可以理解為,同步在同一個執行時間上完成一個時間戳之後,才可以執行下一個時間戳。非同步則可以另起一個執行緒去完成下一個時間戳任務,就是不會佔用上一個執行時間。

  1. 併發(Concurrency)和並行(Parallelism)

並行是指兩個或者多個事件在同一時刻發生。
併發是指兩個或多個事件在同一時間間隔發生。
並行是在不同實體上的多個事件。
併發是在同一實體上的多個事件。
併發是一次處理很多事情。
並行是同時做很多事情。
總之:並行是兩個執行緒(或程序)同時執行,併發指一會做這件事情,一會做這件事情,一會做那件之情,他們有個排程的過程。

  1. 臨界區

保證在某一時刻只有一個執行緒能訪問資料的簡便辦法。在任意時刻只允許一個執行緒對共享資源進行訪問。如果有多個執行緒試圖同時訪問臨界區,那麼在有一個執行緒進入後其他所有試圖訪問此臨界區的執行緒將被掛起,並一直持續到進入臨界區的執行緒離開。臨界區在被釋放後,其他執行緒可以繼續搶佔,並以此達到用原子方式操作共享資源的目的。

  1. 阻塞(Blocking)和非阻塞(Non-Blocking)

阻塞
當一個執行緒進入臨界區,其他執行緒必須等待
無障礙(非阻塞)
無障礙是一種最弱的非阻塞排程;自由出入臨界區;無競爭時,有限步內完成操作;有競爭時,回滾資料
無鎖(非阻塞)
是無障礙的; 保證有一個執行緒可以勝出
while(!atomicVar.compareAndSet(localVar,localVar+1)){
localVar = atomicVar.get();
}
無等待(非阻塞)
無鎖的; 要求所有的執行緒都必須在有限步內完成 ;無飢餓的

  1. 死鎖(Deadlock)、飢餓(Starvation)和活鎖(LiveLock)

有兩個人到飯店吃飯,但是隻有兩根筷子,他們兩個人 一人一根。
死鎖場景:
兩個人互相等待對方拿的一根筷子,各自都不做出讓步,永遠互相等待下去就發生死鎖。
飢餓場景:
兩個人等待飯店再去拿一雙筷子,結果飯店拿的比較慢,他倆等到餓死了,筷子還沒有拿來,此時就發生了飢餓。
活鎖場景:
兩個人一直在交換各自持有的筷子,但是無論如何交換,每個人還是各自持有一根筷子,永遠也吃不了,此時屬於活鎖。
活鎖:
指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。
死鎖:
指的是兩個或者兩個以上的程序相互競爭系統資源,導致程序永久阻塞。
飢餓:
指的是等待時間已經影響到程序執行,此時成為飢餓現象。如果等待時間過長,導致程序使命已經沒有意義時,稱之為“餓死”

  1. 執行緒

執行緒是程式中一個單一的順序控制流程。
程序內有一個相對獨立的、可排程的執行單元,是系統獨立排程和分派CPU的基本單位指令執行時的程式的排程單位。在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。