1. 程式人生 > >真的理解同步和非同步了嗎?

真的理解同步和非同步了嗎?

老實說,玩電腦也玩了好幾年了;印象中看到"同步和非同步"關鍵字的次數已經記不清了,總感覺自己知道點什麼,但卻又說不出來什麼東西,這是為啥?——  因為沒有深入理解,沒有總結;也應了那句古話:紙上學來終覺淺,絕知此事要躬行。不賣關子了,開始進入正題。
”同步“就好比:你去外地上學(人生地不熟),突然生活費不夠了;此時你決定打電話回家,通知家裡轉生活費過來,可是當你撥出電話時,對方一直處於待接聽狀態(即:打不通,聯絡不上),為了拿到生活費,你就不停的oncall、等待,最終可能不能及時要到生活費,導致你今天要做的事都沒有完成,而白白花掉了時間。
“非同步”就是:在你打完電話發現沒人接聽時,猜想:對方可能在忙,暫時無法接聽電話,所以你發了一條簡訊(或者語音留言,亦或是其他的方式)通知對方後便忙其他要緊的事了;這時你就不需要持續不斷的撥打電話,還可以做其他事情;待一定時間後,對方看到你的留言便回覆響應你,當然對方可能轉錢也可能不轉錢。但是整個一天下來,你還做了很多事情。
或者說你找室友臨時借了一筆錢,又開始happy的上學時光了。
簡而言之,言而總之:同步就是我強依賴你(對方),我必須等到你的回覆,才能做出下一步響應。即我的操作(行程)是順序執行的,中間少了哪一步都不可以,或者說中間哪一步出錯都不可以,類似於程式設計中程式被直譯器順序執行一樣;同時如果我沒有收到你的回覆,我就一直處於等待、也就是阻塞的狀態。非同步則相反,我並不強依賴你,我對你響應的時間也不敏感,無論你返回還是不返回,我都能繼續執行;你響應並返回了,我就繼續做之前的事情,你沒有響應,我就做其他的事情。也就是說我不存在等待對方的概念,我就是非阻塞的。

從上面的例子來看:同步似乎等價於阻塞,非同步則等價於非阻塞。其實有些狹義,但不可否認的是,在一定情況下,確實可以這麼認為;因為同步

一定存在著阻塞狀態,而非同步一定不存在非阻塞的狀態。但是不是就是說同步呼叫 == 阻塞呼叫呢?然並不是;阻塞和非阻塞強調的是程式在等待呼叫結果(訊息,返回值)時的狀態.  阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。對於同步呼叫來說,很多時候當前執行緒還是啟用的狀態,只是從邏輯上當前函式沒有返回而已,即同步等待時什麼都不幹,白白佔用著資源。同步和非同步強調的是訊息通訊機制 (synchronous communication/ asynchronous communication)。所謂同步,就是在發出一個"呼叫"時,在沒有得到結果之前,該“呼叫”就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由“呼叫者”主動等待這個“呼叫”的結果。而非同步則是相反,"呼叫"在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在"呼叫"發出後,"被呼叫者"通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。段落參考原文連結:
https://www.zhihu.com/question/19732473/answer/20851256