并行、并發(fā)
并行和并發(fā)比較好理解
- 并發(fā):是指一段時間內(nèi),有幾個線程都在同一個CPU上運行,但任意一個時刻點上只有一個線程在CPU上運行,但是是通過切換時間片的方式交替進行。
- 并行:是指一個時間段內(nèi),多個線程真正的同時運行,這種情況只會出現(xiàn)在多CPU或者多核的系統(tǒng)中,多個CPU核心同時分別處理不同的線程。
阻塞、非阻塞
當線程中調(diào)用某個函數(shù),需要IO請求,或者暫時得不到競爭資源,操作系統(tǒng)會把該線程阻塞起來,避免浪費CPU資源,等得到了資源,再變成runnable狀態(tài),等待CPU調(diào)度。阻塞和非阻塞用來形容多線程間的相互影響。
- 阻塞:如果一個線程占有了臨界區(qū)資源(一般指鎖),那么其他需要這個臨界資源(鎖)的線程必須進行等待該線程釋放鎖,這樣就會導致其他等待線程的阻塞
- 非阻塞:是指沒有一個線程可以阻塞其他線程,所有的線程都會嘗試往前運行。
同步、異步
- 同步:在發(fā)出一個同步調(diào)用時,在沒有得到結果之前,該調(diào)用就不會返回
- 異步:在發(fā)出一個異步調(diào)用后,調(diào)用者不會立刻得到結果,而是直接返回,等得到結果之后再異步通知調(diào)用者結果。
同步例子
int n = func();
next();
//func()的結果沒有返回,next()就不會執(zhí)行,直到func()方法中的代碼運行完并返回
異步例子
Callback callback = new Callback() { //func結果回調(diào)
@Override
public void onResult(int n) {
// n就是異步執(zhí)行完之后的結果
}
};
func(callback);
next();
//func方法里面可能有異步的耗時操作,這里直接傳過去一個callback,然后直接返回,接著執(zhí)行next方法
//等到func中的耗時操作執(zhí)行完之后,再通過callback回調(diào)通知調(diào)用者結果
同步與阻塞、異步與非阻塞是完全不同的概念。同步和異步形容的是方法調(diào)用時是否立即返回;阻塞和非阻塞形容的是多線程并行運行時對資源的占有情況。
同步調(diào)用的時候,雖然調(diào)用沒有立即返回,但是它在運行狀態(tài)中,CPU很可能還在執(zhí)行這段代碼;而如果一個線程被阻塞了,它一定是放棄了CPU的執(zhí)行權,不再在CPU中運行了。
上面兩組概念就有了4中組合:
- 同步阻塞調(diào)用:得不到結果不返回,線程進入阻塞狀態(tài)等待
- 同步非阻塞調(diào)用:得不到結果不返回,線程不阻塞一直在CPU運行
- 異步阻塞調(diào)用:調(diào)用的時候開啟另一個線程,調(diào)用者立即返回,另一個線程運行時由于得不到鎖或者等待IO操作而進入阻塞狀態(tài)。等獲取到鎖或者IO執(zhí)行完成,會繼續(xù)執(zhí)行,得到結果之后通知調(diào)用者
- 異步非阻塞調(diào)用:調(diào)用的時候開啟另一個線程,調(diào)用者立即返回,另一個線程運行時不會因為得不到鎖或者IO操作而阻塞。該線程得到結果之后異步通知調(diào)用者。