平時開發中經常會聽大家說到什么同步阻塞、異步非阻塞等等名詞,這里我談下自己對這兩個名詞的理解,僅僅是個人觀點,并不一定正確。
1.阻塞/非阻塞
我認為判定阻塞還是非阻塞,取決于線程所做的操作是否需要將線程掛起等待。
舉個例子,我們都知道CAS是非阻塞的,而synchronized是阻塞的。為什么呢,因為CAS能快速返回一個獲取鎖成功或失敗結果,線程可以在獲取鎖失敗時再去做其他事情,而synchronized在線程獲取鎖失敗后會將線程掛起,直到鎖釋放后才可能被重新喚醒,這期間線程一直處于blocked的等待狀態。
1.同步/非同步
我認為同步還是非同步,取決于是否是當前線程親自執行操作。若當前線程親自執行操作則為同步,當前線程通過創建或利用其他線程執行操作則為異步。
同樣舉個例子,我們都知道Nio和Aio,一個為同步非阻塞,一個為異步非阻塞。在Nio中所有的業務線程會將關注的讀寫事件和回調接口注冊到事件中心,通過事件管理線程不停的循環檢測是否有就緒的事件,如果有事件管理器就會調用回調接口,業務線程就會去進行相應的讀寫操作和業務邏輯。而區別于Nio,在Aio中業務線程會直接向操作系統提出一個異步IO的請求,然后將回調函數和相關信息注冊到事件中心,操作系統會異步的進行相應IO讀寫操作并將結果寫到指定內存地址,操作完成后由事件管理器調用業務線程的回調接口,業務線程直接使用內存數據。兩者之前的區別在于是否為業務線程親自進行讀寫操作。