網上流傳着一個小故事來介紹同步/異步,阻塞/非阻塞的概念
相信不少同學都看過,(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。具體如下:
同步阻塞:小明把水壺放到火上,然后在那傻等水開
同步非阻塞:小明把水壺放到火上,然后去客廳看電視,時不時的去廚房看看水開沒有
異步阻塞:小明把響水壺放到火上,然后在那傻等水開
異步非阻塞:小明把響水水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去處理
剛看到這個例子的時候,我也覺得講的很生動,一看就明白,但是過一段時間之后,發現自己還是會混淆上面的幾個概念(冥冥之中覺得有bug)。反復查閱網上資料之后,發現網上基本都是這個例子。最后查閱書籍,終於明白了上述概念的真正含義。
上面的例子讓人有以下感覺:
一、如果是同步,那一定就是阻塞的啊,因為調用者需要拿到結果才能執行后面的任務
二、如果是異步,那一定是非阻塞的啊,調用者可以繼續往后執行
現在是我給大家解惑的時候了,直接給出概念
同步/異步:形容一次方法的調用,在單線程中。描述的是執行者是否具備主動通知功能
同步,調用者會等到方法調用返回后才能繼續后面的行為
異步,調用者不需要等到方法返回,方法執行完畢后會主動通知調用者
阻塞/非阻塞:調用者是否可以執行多個任務,在多個線程中。描述的是調用者的多個線程是否可以同時執行
阻塞,線程1和線程2不能同時進行
非阻塞,線程1和線程2可以同時進行
總結:
看明白了嗎?網上小明燒水的這個例子完全沒有提及多線程(被隱藏起來,需要我們自己去發現和理解),但是同步和阻塞完全是在單線程和多線程這兩個維度上的概念。簡單的說,如果是單線程,不管是同步還是異步,肯定是阻塞的。阻塞和非阻塞只有在多線程中才有意義。並且小明燒水的時候去看電視,隱含了這里就是另外新開了一個線程去看電視,而不是在燒水的這個線程中去執行看電視,否則毫無意義。以上,歡迎指正!
