1. 程式人生 > 其它 >簡述js中的同步阻塞和非同步非阻塞

簡述js中的同步阻塞和非同步非阻塞

程序和執行緒

要想了解js中的同步阻塞和非同步非阻塞,首先我們要對程序和執行緒的基本概念有一個清楚 的瞭解。
程序:是併發執行的程式在執行過程中分配和管理資源的基本單位,簡單來說你的電腦每執行一個程式就是一個程序。
執行緒:程序的一個執行單元,是作業系統能夠進行運算排程的最小單位。
一個程式至有一個程序,一個程序至少有一個執行緒。
舉個例子來說明一下

比如你的電腦打開了迅雷,那麼迅雷就是一個程序;你的電腦開啟來QQ,那麼QQ就是一個程序。你的電腦每開啟一個程式就多了一條程序。
拿QQ這個程序來說,你開啟語音,那麼語音就是QQ這個程序中的一個執行緒,你開啟了視訊,就是打開了QQ這個程序中視訊的這個執行緒。

同步和非同步

說完了程序和執行緒,現在再來聊一下同步和非同步
大家都知道js是單執行緒機制的,它分為兩種工作模式,同步模式和非同步模式。
同步:就是發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回或繼續執行後續操作。簡單點來說,同步就是必須一件一件事做,等前一件做完了才能做下一件事。
非同步:與非同步相對,它在發出一個功能呼叫是,在沒得到結果前,可以繼續去進行後續操作,等呼叫完成後在通知呼叫者。通俗點講就是這件事正在做,沒做完,但是你可以去做下一件事,等這件事做完了,再通知你

同步含義是“一起”,非同步含義是“一邊……一邊……”

在程式設計思想裡面理解為:

同步:程式碼的書寫順序和程式碼的執行順序一樣

非同步:程式碼的書寫順序和程式碼的執行順序不一樣 例如:setTimeout() btn.onclick = function(){}

下面用一副圖來描述一下

同步、非同步執行順序:(任務一和任務三是同步任務,任務二是非同步任務)

阻塞和非阻塞,通常指的是針對IO的操作。
阻塞:簡單來說就是,我們呼叫了一個函式之後,在等待這個函式返回結果之前,如果當前的執行緒是處於掛起狀態,那麼就叫阻塞。
非阻塞:與阻塞相反,如果執行一個函式後,當前執行緒仍處於執行狀態,就意味當前執行緒是可以的繼續處理其他任務,但要時不時的去看下是否有結果了,這就是非阻塞。

同步阻塞和非同步非阻塞

阻塞和非阻塞針對於呼叫者,同步非同步針對於被呼叫者,兩兩結合,共有四種狀態,即

  • 同步阻塞
  • 同步非阻塞
  • 非同步阻塞
  • 非同步非阻塞
    接下來用一個例子來形容一下四者的區別,如圖
因為js是單執行緒機制的,所有的操作都必須一個一個來,如果中間有一個操作非常耗時,那整個執行緒都會阻塞在那裡,這就是同步阻塞
為了解決這個問題,js引入了事件和回撥函式機制,對於一個IO操作,比如一個ajax,當發出一個非同步請求後,程式不會阻塞在那裡等待結果的返回,而是繼續執行下面的程式碼。 當請求成功獲取到結果後,就會呼叫回撥函式來處理後面的事情,這個就是非同步非阻塞

來源

https://juejin.cn/post/6844903850483138568

(28條訊息) js非同步和同步、阻塞和非阻塞、程序和執行緒的總結_凌晨四點半er的部落格-CSDN部落格_js非同步非阻塞