1. 程式人生 > >NIO學習筆記,從Linux IO演化模型到Netty—— 究竟如何理解同步、非同步、阻塞、非阻塞

NIO學習筆記,從Linux IO演化模型到Netty—— 究竟如何理解同步、非同步、阻塞、非阻塞

我的觀點

首先,分開各自理解。

1. 同步:描述兩個(或者多個)個體之間的協調關係。

比如,單執行緒中,methodA呼叫了methodB,methodB返回後,methodA才往下執行,那麼稱A同步呼叫了B。

比如,多執行緒中,執行緒1訪問完某個資源,才到執行緒2訪問。

同步在一定的 互斥基礎上,強調的是有序性。(另外,互斥強調的是排他性,我在用的時候你不許用。)

 

2. 非同步:我覺得是指個體之間並沒有協調關係,你走你的陽關道,我走我的獨木橋。

比如,執行緒往執行緒池裡面提交了FutureTask,就繼續往下執行,A叫B幫自己倒杯咖啡,而A自己幹別的事去了。

 

阻塞與非阻塞,都是執行緒或程序的狀態。

3. 阻塞:執行緒或程序被掛起,失去了cpu的使用權。

4.非阻塞:就正常執行下去。

 

非要把兩種概念扯起來理解是沒必要的,對於發生的一件事,從兩種不同的角度去理解即可,如果非要根據這兩種概念去造出一件事,那麼很可能自己會混淆(易混淆的一個點為,同步和阻塞在某種層面上表現為“等”),而且這件事還不對。

 

 比如 BIO中的accept(),呼叫時執行緒會一直阻塞,失去cpu的使用權直到有人連上來,這時候,假如執行緒又回到執行態,如果不去讀取出來,後面的人還連不上。

 

 

 (注意執行緒每次系統呼叫時,要從使用者態切換到核心態)

 

到這裡相信已經這幾個概念已經比較清晰了,還要說什麼同步阻塞,同步非阻塞?

 

所見網上的例子,我認為這樣理解是不恰當

老張愛喝茶,廢話不說,煮開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

1 老張把水壺放到火上,立等水開。(同步阻塞)

老張覺得自己有點傻

2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)

老張還是覺得自己有點傻,於是變高端了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。

3 老張把響水壺放到火上,立等水開。(非同步阻塞)

老張覺得這樣傻等意義不大

4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(非同步非阻塞)

 

我只分析第4點這裡,響了再去拿壺。

但是老張如果沒有一直在聽的話又怎麼知道它響沒響呢?是不是可以把一直在聽也看作是一種輪詢呢?那這樣的話又和同步非阻塞的例子有什麼不同呢?這絕不是找茬,因為誰通知誰,怎麼通知的,怎麼接收通知的,這很重要!

其他的例子更是漏洞百出。

我就說扯起來講沒必要吧。

 

我的例子

如果你真的要等某件事發生才能往下執行的話(同步),那你就應該阻塞等它完成(免得你一直問一直問,浪費資源)。如果你非阻塞,還不一直問他就執行往下執行幹其他事去,那說明你並不是非等他完成不可,那何不等你真的要依賴他的時候再阻塞等候呢。

而非同步說明這兩個人沒有關係,你做你的(你可以睡一覺阻塞,也可以不阻塞),他做他