- Java程序員面試筆試寶典(第2版)
- 何昊等編著
- 774字
- 2022-06-17 16:00:54
2.2 同步與異步、阻塞與非阻塞
在IO體系中,經常能接觸到同步阻塞、異步非阻塞等概念,往往使人疑惑,在多線程環境下,多線程不就是非阻塞的,單線程就是阻塞的嗎?多線程不就是異步,單線程不就是同步嗎?這種普遍的疑惑,事實上是由于概念的不清晰造成的。
多線程、單線程、同步、異步、阻塞、非阻塞,都是獨立的概念,只是在多數應用場景下,它們看上去一致,所以造成了概念的混淆。
(1)在多線程語境下的概念
在多線程語境下,用于描述任務的線程訪問執行機制,同步和異步關注的是任務是否可以同時被調用,阻塞和非阻塞則關注的是線程的狀態。
1)同步:指代碼的同步執行(Synchronous Invoke),一個執行塊同一時間只有一個線程可以訪問;
2)異步:指代碼的異步執行(Asynchronous Invoke),多個執行塊可以同時被多個線程訪問;
3)阻塞:線程阻塞狀態(Thread Block),表示線程掛起;
4)非阻塞:線程不處于阻塞狀態,表示線程沒有掛起。
(2)在IO語境下的概念
在IO語境下,用于描述IO操作,同步和異步關注的是消息發起和接收的機制,阻塞和非阻塞則是表達發起者等待結果時的狀態。
1)同步:是指發起一個IO操作時,在沒有得到結果之前,該操作不返回結果,只有調用結束后,才能獲取返回值并繼續執行后續的操作。
2)異步:是指發起一個IO操作后,不會得到返回,結果由發起者自己輪詢,或者IO操作的執行者發起回調。
3)阻塞:是指發起者在發起IO操作后,不能再處理其他業務,只能等待IO操作結束。
4)非阻塞:是指發起者不會等待IO操作完成。
(3)并發與并行的區別
1)并發(Concurrency):指在同一時刻只能有一條指令執行,但多個進程指令被快速地輪換執行,使得在宏觀上具有多個進程同時執行的效果,但在微觀上并不是同時執行的,只是把時間分成若干段,使多個進程快速交替地執行。
2)并行(Parallel):指在同一時刻,有多條指令在多個處理器上同時執行。所以無論從微觀還是從宏觀來看,二者都是一起執行的。
- Node.js Design Patterns
- AngularJS Testing Cookbook
- R語言編程指南
- Apache Spark Graph Processing
- Production Ready OpenStack:Recipes for Successful Environments
- ASP.NET 3.5程序設計與項目實踐
- Java EE 8 Application Development
- The DevOps 2.5 Toolkit
- Java高并發核心編程(卷1):NIO、Netty、Redis、ZooKeeper
- Java程序員面試筆試寶典(第2版)
- Kivy Cookbook
- Python編程:從入門到實踐(第3版)
- Swift語言實戰晉級
- Application Development with Swift
- 從零開始學Python大數據與量化交易