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