1. 程式人生 > >同步和異步以及阻塞和非阻塞

同步和異步以及阻塞和非阻塞

url href 同步阻塞 必須 html async size sse 輪詢

同步、異步:

概念:消息的通知機制

解釋:涉及到IO通知機制

所謂同步,就是發起調用後,被調用者處理消息,必須等處理完才直接返回結果,沒處理完之前是不返回的,調用者主動等待結果;

所謂異步,就是發起調用後,被調用者直接返回,但是並沒有返回結果,等處理完消息後,通過狀態、通知或者回調函數來通知調用者,調用者被動接收結果。

阻塞、非阻塞:
概念:程序等待調用結果時的狀態
解釋:涉及到CPU線程調度;

所謂阻塞,就是調用結果返回之前,該執行線程會被掛起,不釋放CPU執行權,線程不能做其它事情,只能等待,只有等到調用結果返回了,才能接著往下執行;

所謂非阻塞,就是在沒有獲取調用結果時,不是一直等待,線程可以往下執行,如果是同步的,通過輪詢的方式檢查有沒有調用結果返回,如果是異步的,會通知回調。

經典故事案例:
人物:老張
道具:普通水壺(水燒開不響);響水壺(水燒開發出響聲)
案例:
1、同步阻塞:
老張在廚房用普通水壺燒水,一直在廚房等著(阻塞),盯到水燒開(同步);
2、異步阻塞:
老張在廚房用響水壺燒水,一直在廚房中等著(阻塞),直到水壺發出響聲(異步),老張知道水燒開了;
3、同步非阻塞:
老張在廚房用普通水壺燒水,在燒水過程中,就到客廳去看電視(非阻塞),然後時不時去廚房看看水燒開了沒--(輪詢檢查同步結果);

4、異步非阻塞:
老張在廚房用響水壺燒水,在燒水過程中,就到客廳去看電視(非阻塞),當水壺發出響聲(異步),老張就知道--水燒開了。

註意:
1、通常的IO、NIO操作,都是同步的;
2、JDK1.7提供了AIO異步操作的類,如AsynchronousSocketChannel、AsynchronousServerSocketChannel等;
Java也可以通過多線程,在開啟的線程中,通過回調方式,實現異步操作。

同步和異步以及阻塞和非阻塞