并行菌瘫、并發(fā)
并行和并發(fā)比較好理解
- 并發(fā):是指一段時間內(nèi),有幾個線程都在同一個CPU上運行布卡,但任意一個時刻點上只有一個線程在CPU上運行雨让,但是是通過切換時間片的方式交替進(jìn)行。
- 并行:是指一個時間段內(nèi)忿等,多個線程真正的同時運行栖忠,這種情況只會出現(xiàn)在多CPU或者多核的系統(tǒng)中,多個CPU核心同時分別處理不同的線程贸街。
阻塞庵寞、非阻塞
當(dāng)線程中調(diào)用某個函數(shù),需要IO請求薛匪,或者暫時得不到競爭資源捐川,操作系統(tǒng)會把該線程阻塞起來,避免浪費CPU資源逸尖,等得到了資源古沥,再變成runnable狀態(tài),等待CPU調(diào)度娇跟。阻塞和非阻塞用來形容多線程間的相互影響岩齿。
- 阻塞:如果一個線程占有了臨界區(qū)資源(一般指鎖),那么其他需要這個臨界資源(鎖)的線程必須進(jìn)行等待該線程釋放鎖逞频,這樣就會導(dǎo)致其他等待線程的阻塞
- 非阻塞:是指沒有一個線程可以阻塞其他線程纯衍,所有的線程都會嘗試往前運行。
同步苗胀、異步
- 同步:在發(fā)出一個同步調(diào)用時襟诸,在沒有得到結(jié)果之前,該調(diào)用就不會返回
- 異步:在發(fā)出一個異步調(diào)用后基协,調(diào)用者不會立刻得到結(jié)果歌亲,而是直接返回,等得到結(jié)果之后再異步通知調(diào)用者結(jié)果澜驮。
同步例子
int n = func();
next();
//func()的結(jié)果沒有返回陷揪,next()就不會執(zhí)行,直到func()方法中的代碼運行完并返回
異步例子
Callback callback = new Callback() { //func結(jié)果回調(diào)
@Override
public void onResult(int n) {
// n就是異步執(zhí)行完之后的結(jié)果
}
};
func(callback);
next();
//func方法里面可能有異步的耗時操作杂穷,這里直接傳過去一個callback悍缠,然后直接返回,接著執(zhí)行next方法
//等到func中的耗時操作執(zhí)行完之后,再通過callback回調(diào)通知調(diào)用者結(jié)果
同步與阻塞耐量、異步與非阻塞是完全不同的概念飞蚓。同步和異步形容的是方法調(diào)用時是否立即返回;阻塞和非阻塞形容的是多線程并行運行時對資源的占有情況廊蜒。
同步調(diào)用的時候趴拧,雖然調(diào)用沒有立即返回溅漾,但是它在運行狀態(tài)中,CPU很可能還在執(zhí)行這段代碼著榴;而如果一個線程被阻塞了添履,它一定是放棄了CPU的執(zhí)行權(quán),不再在CPU中運行了脑又。
上面兩組概念就有了4中組合:
- 同步阻塞調(diào)用:得不到結(jié)果不返回暮胧,線程進(jìn)入阻塞狀態(tài)等待
- 同步非阻塞調(diào)用:得不到結(jié)果不返回,線程不阻塞一直在CPU運行
- 異步阻塞調(diào)用:調(diào)用的時候開啟另一個線程挂谍,調(diào)用者立即返回叔壤,另一個線程運行時由于得不到鎖或者等待IO操作而進(jìn)入阻塞狀態(tài)。等獲取到鎖或者IO執(zhí)行完成口叙,會繼續(xù)執(zhí)行炼绘,得到結(jié)果之后通知調(diào)用者
- 異步非阻塞調(diào)用:調(diào)用的時候開啟另一個線程,調(diào)用者立即返回妄田,另一個線程運行時不會因為得不到鎖或者IO操作而阻塞俺亮。該線程得到結(jié)果之后異步通知調(diào)用者。