最准確的理解同步/異步,阻塞/非阻塞


網上流傳着一個小故事來介紹同步/異步,阻塞/非阻塞的概念

相信不少同學都看過,(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。具體如下:

同步阻塞:小明把水壺放到火上,然后在那傻等水開

同步非阻塞:小明把水壺放到火上,然后去客廳看電視,時不時的去廚房看看水開沒有

異步阻塞:小明把響水壺放到火上,然后在那傻等水開

異步非阻塞:小明把響水水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去處理


   剛看到這個例子的時候,我也覺得講的很生動,一看就明白,但是過一段時間之后,發現自己還是會混淆上面的幾個概念(冥冥之中覺得有bug)。反復查閱網上資料之后,發現網上基本都是這個例子。最后查閱書籍,終於明白了上述概念的真正含義。

 上面的例子讓人有以下感覺:

一、如果是同步,那一定就是阻塞的啊,因為調用者需要拿到結果才能執行后面的任務

二、如果是異步,那一定是非阻塞的啊,調用者可以繼續往后執行

 現在是我給大家解惑的時候了,直接給出概念

同步/異步:形容一次方法的調用,在單線程中。描述的是執行者是否具備主動通知功能

  同步,調用者會等到方法調用返回后才能繼續后面的行為

  異步,調用者不需要等到方法返回,方法執行完畢后會主動通知調用者


 阻塞/非阻塞:調用者是否可以執行多個任務,在多個線程中。描述的是調用者的多個線程是否可以同時執行

  阻塞,線程1和線程2不能同時進行

  非阻塞,線程1和線程2可以同時進行


 總結:

        看明白了嗎?網上小明燒水的這個例子完全沒有提及多線程(被隱藏起來,需要我們自己去發現和理解),但是同步和阻塞完全是在單線程和多線程這兩個維度上的概念。簡單的說,如果是單線程,不管是同步還是異步,肯定是阻塞的。阻塞和非阻塞只有在多線程中才有意義。並且小明燒水的時候去看電視,隱含了這里就是另外新開了一個線程去看電視,而不是在燒水的這個線程中去執行看電視,否則毫無意義。以上,歡迎指正!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM