1. 程式人生 > >併發程式設計的幾個基本概念

併發程式設計的幾個基本概念

同步&非同步

同步(Synchronous)

同步方法一旦呼叫必須等待方法呼叫返回後才會繼續後續行動。

非同步(AsyncChronous)

非同步呼叫更像傳遞一個訊息,一旦開始方法呼叫就會返回,呼叫者可以進行後續的操作,在java中非同步方法非同步都會在寧外一個執行緒中執行,就比如CompletableFutre 的runAsync方法一樣。

 

併發程式設計的幾個基本概念

 

 

併發&並行

併發和並行都可以表示兩個或者多個任一起執行。

併發

併發是指多個任務交替執行,多個任務還可能序列的執行。

並行

並行是真正意義上的多個任務同時執行。

 

併發程式設計的幾個基本概念

 

 

臨界區

表示公共資源或者共享資料能夠被多個執行緒使用,但是每次使用只能有一個執行緒使用(比如辦公室的一個印表機,一次只能給一個人列印檔案)。

阻塞&非阻塞

阻塞和非阻塞是指多個執行緒的相互影響(比如一個執行緒佔用了臨界區資源,那麼其他需要使用該資源的執行緒就會被阻塞),而同步和非同步是指方法呼叫。

死鎖&飢餓&活鎖

死鎖、飢餓、活鎖都是多執行緒的活躍性問題。

死鎖

執行緒通常是彼此佔用對方需要的鎖,但是又不願意釋放自己的鎖而導致的。

飢餓

飢餓時指一個或者多個執行緒一直獲取不到需要的資源而無法繼續執行(比如一個執行緒優先順序太低,而高優先順序的執行緒不斷搶佔它的資源,那麼低優先順序的執行緒一直無法得到資源進而無法進行後續的工作)。

活鎖

多個執行緒之間相互謙讓將資源讓給其他執行緒,大家都在相互謙讓導致沒有人能夠獲取到資源。

原子性

是指一個操作時不可中斷的,即使在多個執行緒環境下,一旦一個操作開始,就不會受其他執行緒的干擾(比如兩個執行緒對一個int i = 0 進行賦值-1或1,不管兩個執行緒如何操作,i的值要麼是-1,要麼是1)

可見性

可見性是指一個執行緒修改了某個共享變數,其他執行緒是否能夠立即知道這個修改,對於序列程式不存在這個問題,但是多執行緒環境就不一樣了,(如果CPU1和CPU2 共享一個變數t,那麼CPU1會將t快取到暫存器中,如果CPU2上的某個執行緒修改了這個變數,CPU1可能無法意識到這個變化依然讀取的是cache或者暫存器中的值)

有序性

程式在執行的過程中可能會發生指令重排

程序&執行緒

程序

比如windows裡執行的QQ,微信等程式,他們直接不會共享記憶體資料

執行緒

比如QQ可以邊視訊,邊傳檔案,而傳檔案和視訊就是執行緒,執行緒之間是可以共享記憶體資料的,程序可以看做是執行緒的容器

參考資源:《實戰高併發程式設計》