同步/异步阻塞/非阻塞
平時開發(fā)中經(jīng)常會聽大家說到什么同步阻塞、異步非阻塞等等名詞,這里我談下自己對這兩個名詞的理解,僅僅是個人觀點,并不一定正確。
1.阻塞/非阻塞
我認為判定阻塞還是非阻塞,取決于線程所做的操作是否需要將線程掛起等待。
舉個例子,我們都知道CAS是非阻塞的,而synchronized是阻塞的。為什么呢,因為CAS能快速返回一個獲取鎖成功或失敗結(jié)果,線程可以在獲取鎖失敗時再去做其他事情,而synchronized在線程獲取鎖失敗后會將線程掛起,直到鎖釋放后才可能被重新喚醒,這期間線程一直處于blocked的等待狀態(tài)。
1.同步/非同步
我認為同步還是非同步,取決于是否是當前線程親自執(zhí)行操作。若當前線程親自執(zhí)行操作則為同步,當前線程通過創(chuàng)建或利用其他線程執(zhí)行操作則為異步。
同樣舉個例子,我們都知道Nio和Aio,一個為同步非阻塞,一個為異步非阻塞。在Nio中所有的業(yè)務(wù)線程會將關(guān)注的讀寫事件和回調(diào)接口注冊到事件中心,通過事件管理線程不停的循環(huán)檢測是否有就緒的事件,如果有事件管理器就會調(diào)用回調(diào)接口,業(yè)務(wù)線程就會去進行相應(yīng)的讀寫操作和業(yè)務(wù)邏輯。而區(qū)別于Nio,在Aio中業(yè)務(wù)線程會直接向操作系統(tǒng)提出一個異步IO的請求,然后將回調(diào)函數(shù)和相關(guān)信息注冊到事件中心,操作系統(tǒng)會異步的進行相應(yīng)IO讀寫操作并將結(jié)果寫到指定內(nèi)存地址,操作完成后由事件管理器調(diào)用業(yè)務(wù)線程的回調(diào)接口,業(yè)務(wù)線程直接使用內(nèi)存數(shù)據(jù)。兩者之前的區(qū)別在于是否為業(yè)務(wù)線程親自進行讀寫操作。
總結(jié)
以上是生活随笔為你收集整理的同步/异步阻塞/非阻塞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Minor GC和Full GC
- 下一篇: flush privileges