實戰Java高併發程式設計之概念

2021-07-29 09:07:00 字數 2179 閱讀 2950

學習高併發你必須知道的幾個重要的概念:

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

同步和非同步是對方法的呼叫而言的:

同步呼叫時,會等待呼叫的方法完成以後才能繼續執行這個方法。

非同步呼叫的時候會瞬間的返回,但是並不是表示這個請求已經完成了,但是會在後台起乙個執行緒去執行接下來的任務

2.併發(concurrency)和並行(parallelism)

外在表象是一致的,一般不用去區分。

並行:兩個程序或者執行緒同時在執行

併發:一會做這一回做那,有個排程的過程。

單cpu只能併發,多cpu可並行

3.臨界區

用來表示一種公共的資源或者說是共享資源,可以被多個執行緒使用。但是每次只能有乙個執行緒使用它,一旦臨界區資源被占用,其他執行緒要想使用這個資源,就必須等待。

4. 阻塞(blocking)和非阻塞(non-blocking)

– 阻塞和非阻塞通常用來形容多執行緒間的相互影響。

比如乙個執行緒占用了臨界區資源,那麼其它所有需要這個資源的執行緒就必須在這個臨界區中進行等待,等待會導致執行緒掛起。這種情況就是阻塞。

此時,如果占用資源的執行緒一直不願意釋放資源,那麼其它所有阻塞在這個臨界區上的執行緒都不能工作。

– 非阻塞允許多個執行緒同時進入臨界區

-- 阻塞的效能一般來說不是太好。

5.死鎖(deadlock)、飢餓(starvation)和活鎖(livelock)

活鎖:電梯遇人。面對面,你往左讓路,他往右讓路,還是堵著。一直讓一直堵

動態的,比死鎖更麻煩

飢餓:是指乙個或者多個執行緒因為種種原因無法獲得所需要的資源,導致一直無法執行。

6. 並行的級別

6.1阻塞

當乙個執行緒進入臨界區後,其他執行緒必須等待

6.2無障礙(obstruction-free)

– 無障礙是一種最弱的非阻塞排程

– 自由出入臨界區

– 無競爭時,有限步內完成操作

– 有競爭時,回滾資料

假設有10個執行緒進入了臨界區,如果他們相互干擾,就會存在都出不鳥臨界區,最後導致資料回滾.

6.3無鎖(lock-free)

– 是無障礙的

– 保證有乙個執行緒可以勝出

無鎖在無障礙的基礎上增加了:保證有乙個執行緒可以勝出,十個執行緒的時候保證乙個可以勝出,勝出乙個以後,9個執行緒裡也必然有乙個能勝出,如此迴圈,最後都搶到資源執行完成.

無鎖的**:

while (!atomicvar.compareandset(localvar, localvar+1)) 

6.4無等待(wait-free)

– 無鎖的

– 要求所有的執行緒都必須在有限步內完成

任何執行緒都能無障礙進入臨界區,並且能在有限步內完成操作,離開臨界區.使得系統執行流暢

– 無飢餓的

並行的最高端別

7.有關並行的2個重要定律

不是很懂.以後懂了在補充

Java高併發程式設計之CountDownLatch

儘管這是挺好的解決辦法,當絕對談不上最佳,本篇文章進一步講解更優的解決方案。使用latch 門閂 替代wait notify來進行通知,其好處是通訊方式簡單,同時也可以指定等待時間。countdownlatch不涉及鎖定,當count的值為零的時候當前執行緒繼續執行。當不涉及同步,只是涉及執行緒通訊...

實戰Java高併發程式設計(三)JDK並發包

同步控制 重入鎖 重入鎖可以完全替代synchronized關鍵字。其使用方法如下 public reentrantlock lock new reentrantlock public void run finally 由於其通過人工進行lock和unlock,因此比synchronized更好控制...

併發與高併發程式設計實戰01 基本概念

前言 抽象的東西之所以難易理解,是因為它短。若是對應的解釋能和具象的實物聯絡起來那就容易理解了 併發與高併發是兩個概念 併發同時擁有兩個或者多個執行緒,如果程式在單核處理器上執行,多個執行緒將交替地換入或者換出記憶體,這些執行緒是同時 存在 的,每個執行緒都處於執行過程中的某個狀態,或者執行期,休眠...